Как выполнять атомарные операции в режиме гибернации?

#hibernate #transactional

#режим гибернации #транзакционный

Вопрос:

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

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

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

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

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

Спасибо,

ХМ

Ответ №1:

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

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