Как выполнять атомарные операции в Hibernate? - PullRequest
5 голосов
/ 14 мая 2011

Привет
У меня есть спящий объект, который имеет набор другого объекта в качестве своего поля.Примерно так:

public class UserEntity implements Srializable {
    private Set<Role> roles;
}

Я должен хранить таблицы таким образом, чтобы в системе всегда был хотя бы один пользователь ADMIN.Это можно сделать простым способом, как показано ниже:

public void updateUser{
     UserEntity ue = getUser();
     if (userIsNotTheLastAdmin(ue)) {
     /** Here is a race condition **/
         roles.remove(Role.ADMIN);
         getSession().saveOrUpdate(ue);
     }              
}

Но настоящая проблема возникает, когда у нас есть параллельные операции.Как я могу выполнить все операции атомарным способом?
Спасибо,
HM

1 Ответ

1 голос
/ 14 мая 2011

, поскольку вы, вероятно, не хотите блокировать всю таблицу БД, что является довольно злым делом, вы можете иметь поле в таблице вашей группы со значением usercount, тогда вы можете распределить свои транзакции по манипуляциям с пользовательской таблицей и Обновите значение соответствующего поля в таблице групп и убедитесь, что количество пользователей для определенных групп не упало ниже 1. Поскольку hibernate автоматически получает блокировки записи для обновлений, вам не придется думать о стратегиях ручной блокировки, как описано здесь: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-locking

надеюсь, что помогло ..

...