Грааль пессимистическая блокировка
Я пытаюсь заблокировать сущность внутри сервиса в Grails.
Код:
TheEntity entityForUpdate = TheEntity.lock(entityId)
(...) // some code
entityForUpdate.save()
Этот код работает, пока не произойдет одновременный доступ. Когда это происходит, один поток остается заблокированным, в то время как первый выполняет код. После снятия блокировки выдается исключение:
ERROR errors.GrailsExceptionResolver - StaleObjectStateException occurred when processing request: [POST] /Portal/Controler/theMethod - parameters:
param1: 18
param2: 86,32
Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [core.TheEntity#133]. Stacktrace follows:
Message: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [core.TheEntity#133]
Line | Method
->> 96 | lock in org.hibernate.dialect.lock.SelectLockingStrategy
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 1441 | lock in org.hibernate.persister.entity.AbstractEntityPersister
| 110 | upgradeLock . . . . . . . . . . . . . in org.hibernate.event.def.AbstractLockUpgradeEventListener
| 86 | onLock in org.hibernate.event.def.DefaultLockEventListener
| 774 | fireLock . . . . . . . . . . . . . . in org.hibernate.impl.SessionImpl
| 758 | lock in ''
| 665 | doInHibernate . . . . . . . . . . . . in org.springframework.orm.hibernate3.HibernateTemplate$10
| 406 | doExecute in org.springframework.orm.hibernate3.HibernateTemplate
| 374 | executeWithNativeSession . . . . . . in ''
| 663 | lock in ''
| 148 | lock . . . . . . . . . . . . . . . . in
...
Я не понимаю, почему это происходит. Почему метод блокировки выдает это исключение?
РЕДАКТИРОВАТЬ:
Наконец, я решил удалить версию из сущности, чтобы избежать проблемы:
class TheEntity {
...
static mapping = {
version false
}
...
}
Чтобы получить обновленные данные, я также установил режим транзакции метода сервиса READ_COMMITED
@Transactional(isolation=Isolation.READ_COMMITTED)
def theMethod() {
}