У меня большое веб-приложение на asp.net 2.0.
Используйте открытый редактор объектов и вносите некоторые изменения. Они не могут открыть один и тот же объект одновременно.
После того, как они нажимают «сохранить», все процессы изменений сохраняются на сервере с помощью обратной передачи.
Я использую транзакцию для сохранения. Перед выполнением операции сохранения необходимо выполнить множество процедур, проверок и других действий.
using (SqlConnection con = .........)
{
SqlTransaction trans = null;
try
{
con.Open();
trans=con.BeginTransaction(IsolationLevel.ReadUncommitted);
........operations.........
trans.Commit();
}
catch (Exception e)
{
try { if (trans != null) trans.Rollback(); }
catch { }
throw new MyException("SQL Exception: " + e.Message, e);
}
finally
{
if (con != null && con.State == ConnectionState.Open) con.Close();
}
}
Для меня этот код вполне безопасен.
Но периодически случается:
один процесс из этого веб-приложения по сохранению операции на mssql стал «спящим / ожидающим».
и другие процессы, вызываемые другими пользователями, блокируются этим процессом и организуют очередь.
Один из них сгенерировал исключение тайм-аута ... но другие ждут.
Итак, мой вопрос: есть ли в моем коде какая-то плохая операция, которая позволяет команде переходить в режим ожидания / ожидания?
Может быть, есть какие-то хитрости?