2017-01-12 4 views
0

Я пытаюсь написать функцию Groovy/Grails 3, которая ищет объект базы данных, блокирует его, а затем сохраняет его (автоматически отпуская замок).Ждите блокировки в транзакции Grails

Если функция вызывается несколько раз, она должна ждать, пока блокировка не будет выпущена, а затем запустите обновление. Как я могу это сделать?

def updateUser(String name) { 
    User u = User.get(1) 
    // if locked, wait until released somehow? 
    u.lock() 
    u.name = name 
    u.save() 
} 

updateUser('bob') 
updateUser('fred') // sees lock from previous call, waits until released, then updates 
+1

Необходимо, чтобы с помощью NewTransaction недавний ответ не смог найти его. вот старшая http://stackoverflow.com/questions/21805893/handling-grails-transactions-programatically. Не думайте, что вам нужно беспокоиться о блокировке записи. Оберните его вокруг. С помощью NewTransaction. Это также означает, что если вы запросите его сразу после этого, вам может понадобиться сделать то же самое ... – Vahid

ответ

0

u.save(flush:true)

Промывка сессии Hibernate должен завершить транзакцию и снять блокировку на уровне базы данных.

0

Вообще говоря, pessimistick locking работает только в transactional context. Поэтому не забудьте поместить метод updateUser в службу, аннотированную с помощью @Transactional.

Вызов get(), а затем lock() приводит к выполнению 2-х строковых операторов (один для получения объекта, другой для его блокировки). Используя User.lock(), выдается один выбор ... для udpate-запроса.

@Transactional 
class UserService { 
    def updateUser(String name) { 
     User u = User.lock(1) // blocks until lock is free 
     u.name = name 
     u.save() 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^