Простая модель для тестирования:
class Registration { Date dateRequest; }
в таблице есть одна запись с id = 1
1) Следующий код отрабатывает без проблем:
def testOne = { def one = Registration.get(1); def two = Registration.get(1); one.dateRequest = new Date(); one.save(flush: true); sleep(1000); two.dateRequest = new Date(); two.save(flush: true); }
По моей логике на строке two.save должен сработать exception, так как при one.save поле `version` в таблице увеличивается на единицу и данные считаются уже измененными.
2) Кучу не понятных exception, хотя должен быть быть только один (судя по документации http://www.grails.org/doc/latest/guide/single.html#5.3.5 Pessimistic and Optimistic Locking)
def testTwo { def existReg = Registration.get(1); if (params.test) { sleep(5000); } try { existReg.dateRequest = new Date(); existReg.save(flush: true); } catch(org.springframework.dao.OptimisticLockingFailureException e) { } }
запускаю в следующей последовательности:
* /site/testTwo?test=1 (открывает запись и засыпает на 5 секунд)
* /site/testTwo (открывает запись, изменяет, сохраняет успешно)
Далее первый запрос через 5 секунд при сохранении отваливается с ошибками:
Error 500: Object of class [Registration] with identifier [1]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException:
Servlet: grails
URI: /app/grails/site/testTwo.dispatch
Exception Message: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [Registration#1]
Caused by: Object of class [Registration] with identifier [1]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException:
Class: Unknown
Кто как работает с оптимистичными блокировками ? И что делать ?