В следующем примере показано, как замки не будут освобождены в результате незавершенной открытой сделки: Откройте SQL сервер Query Analyzer и запустить следующую партию, но отменить сделку до ее завершения:
Begin Tran
Update authors set state = 'CA'
waitfor delay "00:02:00" --Cancel the command
Commit Tran
View замки, удерживаемые при выполнении следующей команды:
sp_lock
Вы видите, что блокировки хранятся для таблицы авторов.
Из того же идентификатор серверного процесса (SPID), выполнить следующую партию:
Begin Tran
Update titleauthor set au_ord = 0
Commit Tran - Completed transaction.
Просмотр блокировок, удерживаемых, выполнив следующую команду:
sp_lock
Вы видите, что, хотя последняя транзакция завершена, блокировки хранятся как для авторов, так и для таблиц titleauthors. Причина в том, что первая транзакция не была завершена, и когда вторая транзакция была выполнена из того же соединения, она рассматривалась как вложенная транзакция.
Вы можете просмотреть количество транзакций, проверяя @@ TRANCOUNT глобальную переменную, выполнив следующую инструкцию:
select @@trancount
Этот запрос возвращает 1, что указывает на то, что одна сделка является выдающимся.
Любые дальнейшие транзакции, которые выполняются из этого соединения, рассматриваются как вложенные. Замки продолжают накапливаться и не освобождаются до тех пор, пока не будет выполнен ROLLBACK, который откатывается к самой внешней транзакции или к точке сохранения. В продолжение примера, вы можете увидеть, как откат может привести к завершенные транзакции будут сведены на нет, выполнив следующую транзакцию из той же связи:
Begin Tran
Update titles set royalty = 0
Rollback
Откат катится партию назад к внешней транзакции, даже хотя есть завершенная транзакция (2) на titleauthors. Откат завершенной транзакции происходит, потому что завершенная транзакция рассматривается как вложенная транзакция.
Чтобы избежать такого рода проблем, проверьте после каждой операции, чтобы увидеть, если сделка будет завершена, используя следующую инструкцию:
If @@trancount > 0 rollback
Ссылка: Incomplete transaction may hold large number of locks and cause blocking
В диком догадка, вы имели более ранний версию этого скрипта, который вы запускали в том же окне, который был ошибочен после 'begin tran' и никогда не доходил до' commit' или 'rollback'. Первая транзакция все еще была открыта. –