У меня есть приложение (ASP.NET MVC), которое использует метод Next New, чтобы получить следующую новую часть работы. Пользователь нажимает кнопку «Next New», и мой код NHibernate отправляет следующую работу с активным статусом. Поскольку количество пользователей увеличилось, мы столкнулись с проблемой, когда 2 пользователя могут получить одну и ту же работу. Это происходит даже при том, что я обернул мои вызовы SELECT и UPDATE в транзакцию.
Я также попытался установить для транзакции значение IsolationLevel из RepeatableRead, но это просто вызвало бы исключение TransactionException, когда 2 пользователя пытаются получить доступ к данным одновременно.
Вот процесс, который я сейчас использую:
- Получить следующий рабочий объект
- Обновите объект, чтобы показать, что он отложен, и сохраните его в БД
- Отображение работы пользователю
Вот код, который я сейчас использую:
using (var txn = _repository.Session.BeginTransaction(IsolationLevel.RepeatableRead))
{
try
{
newAccount = _repository.FindFirstWithLock(criteria, LockMode.Read);
newAccount.QueueStatus = pendingStatus;
_repository.Save(newAccount);
txn.Commit();
}
catch (Exception)
{
txn.Rollback();
throw;
}
}
Критерий - это объект DetachedCriteria, который просто ищет активные учетные записи и сортирует их по убыванию по дате.
У кого-нибудь есть какие-либо предложения о том, как я мог бы сделать эту работу?