У нас возникла проблема при использовании NHibernate с распределенными транзакциями.
Рассмотрим следующий фрагмент:
//
// There is already an ambient distributed transaction
//
using(var scope = new TransactionScope()) {
using(var session = _sessionFactory.OpenSession())
using(session.BeginTransaction()) {
using(var cmd = new SqlCommand(_simpleUpdateQuery, (SqlConnection)session.Connection)) {
cmd.ExecuteNonQuery();
}
session.Save(new SomeEntity());
session.Transaction.Commit();
}
scope.Complete();
}
Иногда, когда сервер находится под экстремальной нагрузкой, мы видим следующее:
Если оставить приложение в покое, оно в конце концов (через несколько секунд или минут) выйдет из этого состояния.
Почему исключение тупика не сообщается на шаге 1? И если мы не можем решить эту проблему, то как мы можем предотвратить временную неработоспособность нашего приложения?
Проблема была воспроизведена в следующих средах
Я создал тестовое приспособление, которое иногда воспроизводит проблему для нас. Он доступен здесь: http://wikiupload.com/EWJIGAECG9SQDMZ