2016-01-08 2 views
2

Я запустил сценарий, аналогичный приведенному ниже в окне запроса SSMS. После успешного выполнения сценария некоторые блокировки остались на затронутых таблицах. Когда я пытаюсь закрыть окно, появляется окно с сообщением о том, хочу ли я совершить или отменить транзакцию.Sql Transaction не освобождает блокировку после фиксации

После выбора одного из вариантов блокировки освобождаются. Что может вызывать такое поведение?

begin tran 
delete from tableA 
delete from tableB 
insert into tableB 
insert into tableA 
commit tran 

Я подключен к удаленному Sql Server 2014 и работает ВСС 2014, локальной

Спасибо!

+2

В диком догадка, вы имели более ранний версию этого скрипта, который вы запускали в том же окне, который был ошибочен после 'begin tran' и никогда не доходил до' commit' или 'rollback'. Первая транзакция все еще была открыта. –

ответ

1

В следующем примере показано, как замки не будут освобождены в результате незавершенной открытой сделки: Откройте 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

+0

, если вы используете ссылку с некоторых других сайтов, пожалуйста, измените код на основе пользовательских вопросов и таблиц –

Смежные вопросы