2014-02-17 1 views
6

Если вы вызываете lock() на экземпляр домена или статически в классе, а затем вы решаете, что ничего не нужно делать с объектом, есть ли способ вручную и сразу же освободить блокировку?Как вы разблокируете объект домена после вызова lock()?

+1

Он заблокирован для обновления, поэтому вы можете вызвать 'save()' на объекте домена, чтобы освободить замок, хотя это может быть дорого. – dmahapatro

ответ

2

Чтобы расширить то, что dmahapatro словам, docs указывают:

Замок автоматически освобождается при транзакции

так, как только вы звоните .save(), замок будет выпущен, когда сделка для этого сохраняются фиксации (как правило, в конце метода обслуживания).

Вы также можете ознакомиться с этими docs.

+1

Я уже видел документы, на которые вы ссылаетесь. Я надеялся, что они просто что-то оставили, т. Е. Способ обратить вспять нежелательный замок. Наверное, нет другого пути, или вы или документы могли бы упомянуть об этом? Как насчет вложенной транзакции? Могу ли я начать вложенную транзакцию, заблокировать строку и затем отменить вложенную транзакцию, если блокировка не нужна? – greymatter

+0

@greymatter Хм, не уверен, что вложенные транзакции, но я нашел эту ссылку, которая может быть полезна? http://grails.1312388.n4.nabble.com/Service-transaction-and-locks-td1355167.html – Igor

+0

Это было не то, на что я надеялся, но я собираюсь отметить это. Благодаря! – greymatter

0

Блокировка освобождается при совершении транзакции, но не тогда, когда вы просто вызываете save(), потому что после сохранения транзакции save() все еще сохраняется. Транзакция может быть совершена, когда выполнение кода покидает метод службы или когда сеанс спящего режима сбрасывается (после завершения HTTP-запроса сеанс очищается и очищается).

Лучший способ освободить замок - это ручная обработка транзакций. В сервисе сделайте так:

def saveUser(Long userId) 
{ 
    User.withNewTransaction { TransactionStatus status -> 
     User user = User.lock(userId) 
     user.save() 
    } 
} 
+0

Способы обслуживания автоматически помещаются в транзакции (по умолчанию). –

+0

Да, но это происходит слишком поздно. Другая параллельная транзакция не может ее увидеть, услуга может вызывать другие сервисы, и может потребоваться несколько минут, пока транзакция не будет выполнена. –

+0

Вижу, я не читал ваш ответ четко. Спасибо за разработку. –