Незавершенная транзакция может содержать большое количество блокировок и привести к блокировке

Обзор

Если транзакция не завершена, время ожидания запроса или пакета отменяется в середине транзакции без выдачи инструкции COMMIT или ROLLBACK для завершения транзакции, транзакция остается открытой и продолжают удерживаться все блокировки, полученные во время этой транзакции. Последующие транзакции выполняются в том же соединении, рассматриваются как вложенных транзакций, не освобождаются все блокировки, полученные в этих завершенных транзакций. Эта проблема повторяется с всех транзакций, выполненных в том же соединении выполняется ОТКАТ. В результате проведения большого числа блокировок, заблокированные пользователи и потерянные транзакции, что приводит данные, отличается от ожидаемого.

Дополнительные сведения

В следующем примере показано, как они не освобождаются в результате незавершенные открытой операции:

  1. Откройте анализатор запросов SQL Server и запустите следующий пакет, но отменить транзакцию до ее завершения:

    Begin TranUpdate authors set state = 'CA'
    waitfor delay "00:02:00" --Cancel the command
    Commit Tran

  2. Просмотр блокировок, удерживаемых, выполнив следующую команду:

    sp_lock

    Вы увидите, что блокировки удерживаются для таблицы authors .

  3. Из того же идентификатор процесса сервера (SPID) выполните следующий пакет:

    Begin TranUpdate titleauthor set au_ord = 0
    Commit Tran - Completed transaction.

  4. Просмотр блокировок, удерживаемых, выполнив следующую команду:

    sp_lock

    Вы увидете, что хотя последняя транзакция и завершена - блокировки остаются и на таблице "authors", и на таблице "titleauthors" . Причина заключается в том, что первая транзакция не была завершена и когда вторая транзакция была выполнена в том же соединении, оно обрабатывается как вложенная транзакция.

    Можно просмотреть счетчик транзакций, проверив глобальную переменную @@trancount с помощью следующей инструкции:

    select @@trancount

    Этот запрос возвращает 1, что указывает, что выполняется одна транзакция.

    Любые дополнительные операции, выполняемые из данного подключения обрабатываются как вложенный. Блокировки продолжают накапливаться и не освобождаются, пока не будет выполнен ОТКАТ, какие откатов для большинства внешней транзакции или до точки сохранения.

Продолжая рассматривать пример, видно как откат может привести к завершенной транзакции с отрицанием, выполняя следующие операции в том же соединении:

Begin TranUpdate titles set royalty = 0
Rollback

Команда rollback откатывает пакет до самой внешней транзакции, несмотря на наличие завершенных транзакций (2) на titleauthors. Вложенная транзакция считается завершенной транзакции возникает отката в завершенной транзакции.

Чтобы избежать такого рода проблемы, проверьте после каждой операции, чтобы увидеть, если транзакция завершается с помощью следующей инструкции:

If @@trancount > 0 rollback

ССЫЛКИ

Описание способов наблюдения за блокирование сценариев SQL в SQL Server 7.0 или SQL Server 2000 см. ниже статьях базы знаний Майкрософт:

Как 251004 для отслеживания блокировок SQL Server 7.0

Как 271509 для отслеживания блокировок в SQL Server 2005 и SQL Server 2000

Нужна дополнительная помощь?

Совершенствование навыков
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединение к программе предварительной оценки Майкрософт

Были ли сведения полезными?

Спасибо за ваш отзыв!

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

×