Optimistic Locking
Помогите разобраться с оптимистичными блокировками.
Простая модель для тестирования:
в таблице есть одна запись с id = 1
1) Следующий код отрабатывает без проблем:
По моей логике на строке two.save должен сработать exception, так как при one.save поле `version` в таблице увеличивается на единицу и данные считаются уже измененными.
2) Кучу не понятных exception, хотя должен быть быть только один (судя по документации http://www.grails.org/doc/latest/guide/single.html#5.3.5 Pessimistic and Optimistic Locking)
запускаю в следующей последовательности:
* /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: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [Registration#1]
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: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [Registration#1]
Class: Unknown
Кто как работает с оптимистичными блокировками ? И что делать ?
Простая модель для тестирования:
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
Кто как работает с оптимистичными блокировками ? И что делать ?
