команда сна в ожидании блокирует другие транзакции - PullRequest
1 голос
/ 06 декабря 2010

У меня большое веб-приложение на 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 стал «спящим / ожидающим». и другие процессы, вызываемые другими пользователями, блокируются этим процессом и организуют очередь.

Один из них сгенерировал исключение тайм-аута ... но другие ждут.

Итак, мой вопрос: есть ли в моем коде какая-то плохая операция, которая позволяет команде переходить в режим ожидания / ожидания? Может быть, есть какие-то хитрости?

Ответы [ 3 ]

1 голос
/ 06 декабря 2010

Поскольку вы выполняете много операций с БД внутри транзакции, есть вероятность, что блокировка базы данных блокирует ваше приложение.

Вы можете использовать хранимую процедуру sp_who2 (подробнее об этом здесь ), чтобы проверить, есть ли какие-либо блоки на вашем сервере, проверив столбец BlkBy результата.

Возможно, вы также захотите проверить следующие ссылки на Sql Server блокировки и взаимоблокировка

0 голосов
/ 17 декабря 2010

Может ли это быть связано с репликацией. В момент, когда наблюдаются описанные выше тормоза, репликация начинает сильно тормозить. И пишет: Процесс не может подключиться к издателю "эта бд". (Источник: MSSQL_REPL, Номер ошибки: MSSQL_REPL20084) Получить помощь: http://help/MSSQL_REPL20084

· Поставщик TCP: попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить соединение, так как подключенный хост не смог ответить. (Источник: MSSQLServer, номер ошибки: 10060) Получить помощь: · Произошла ошибка при установлении соединения с сервером. При подключении к SQL Server 2005 этот сбой может быть вызван тем, что в настройках по умолчанию SQL Server не разрешает удаленные подключения. (Источник: MSSQLServer, номер ошибки: 10060) Получить помощь: · Время ожидания входа истекло (Источник: MSSQLServer, Номер ошибки: 0) Получить помощь: · Процесс слияния не смог выполнить запрос, потому что время запроса истекло. Если этот сбой продолжается, увеличьте время ожидания запроса для процесса. При устранении неполадок перезапустите синхронизацию с подробным ведением журнала и укажите выходной файл для записи. (Источник: MSSQLServer, номер ошибки: 0) Получить помощь: Эта БД является результатом репликации.

0 голосов
/ 16 декабря 2010

Но главная проблема в том, что первый процесс не выбрасывает исключение тайм-аута. Он спит как бревно, потому что мы его не убиваем. Это главная проблема.

...