#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
надеюсь, это помогло..