Грааль пессимистическая блокировка

Я пытаюсь заблокировать сущность внутри сервиса в 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() {

}

0 ответов

Другие вопросы по тегам