пессимистическая блокировка: блокировка граалей сущностей базы данных

Я следил за документацией grails, в которой говорится, что для пессимистической блокировки я могу сделать так:

def plan = Plan.findWhere(user:user, [lock: true])

так что это блокирует экземпляр плана до тех пор, пока на нем не будет завершено сохранение. Теперь в моем случае я хочу заблокировать сразу несколько планов, например:

def plan = Plan.findAllWhere(user:user, [lock: true])

Я делаю это в службе grails, которая по умолчанию является транзакционной, но строка выше не работает должным образом. Она не блокирует все строки и выдает stale state exception, если выполняется параллельная транзакция.

Как я могу заблокировать несколько строк при чтении?

Дополнительную информацию см. В соответствующем вопросе: одновременная транзакция в grails, приводящее к исключению устаревшего состояния базы данных


person vishesh    schedule 22.11.2013    source источник


Ответы (1)


Вы можете сделать что-то вроде этого, что мне подходит:

Process.withNewTransaction {
    def process = Process.get(job.process.id)
    process.lock()
    process.sessionId = 0
    process.processId = 0
    process.save(flush:true)    
}
person moskiteau    schedule 22.11.2013
comment
это работает для вас, потому что вы получаете только одну строку, выполнив Process.get(job.process.id). Просмотрите связанный вопрос, в котором подробно описано, почему я не могу использовать такое решение, как ваше. Спасибо - person vishesh; 22.11.2013