Sql Transaktion löscht keine Sperre nach Commit

Ich habe ein Skript ähnlich dem unten in einem SSMS-Abfragefenster ausgeführt. Nachdem das Skript erfolgreich ausgeführt wurde, blieben einige Sperren auf betroffenen Tabellen. Wenn ich versuche, das windows zu schließen, wird mir eine Meldung angezeigt, wenn ich die Transaktion begehen oder abbrechen möchte.

Nachdem ich eine der Optionen gewählt habe, werden die Schlösser freigegeben. Was kann dieses Verhalten verursachen?

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

Ich bin mit einem entfernten Sql server 2014 verbunden und laufe lokal SSMS 2014

Vielen Dank!

Das folgende Beispiel veranschaulicht, wie Sperren nicht als Ergebnis einer unvollendeten offenen Transaktion freigegeben werden: Öffnen Sie den SQL server Query Analyzer und führen Sie den folgenden Batch aus, aber brechen Sie die Transaktion ab, bevor er abgeschlossen ist:

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

Zeigen Sie die Sperren an, die durch Ausführen des folgenden Befehls gehalten werden:

 sp_lock 

Sie sehen, dass Schlösser für den Autoren-Tisch gehalten werden.

Von der gleichen server-process-ID (SPID) führen Sie den nächsten Batch aus:

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

Zeigen Sie die Sperren an, die durch Ausführen des folgenden Befehls gehalten werden:

 sp_lock 

Sie sehen, dass, obwohl die letzte Transaktion abgeschlossen ist, Sperren auf beiden Autoren und Titelautoren Tabellen gehalten werden. Der Grund dafür ist, dass die erste Transaktion nicht abgeschlossen wurde und wenn die zweite Transaktion aus derselben Verbindung ausgeführt wurde, wurde sie als verschachtelte Transaktion behandelt.

Sie können die Transaktionszählung anzeigen, indem Sie die globale Variable @@ trancount überprüfen, indem Sie die folgende statement ausgeben:

 select @@trancount 

Diese Abfrage gibt 1 zurück, was anzeigt, dass eine Transaktion hervorragend ist.

Alle weiteren transactions, die aus dieser Verbindung ausgeführt werden, werden als verschachtelt behandelt. Die Schlösser sammeln sich weiterhin an und werden erst dann freigegeben, wenn ein ROLLBACK ausgeführt wird, der auf die äußerste Transaktion oder auf einen Sicherungspunkt zurückkehrt. Wenn Sie mit dem Beispiel fortfahren, können Sie sehen, wie ein Rollback eine abgeschlossene Transaktion veranlassen kann, indem Sie die folgende Transaktion aus derselben Verbindung ausführen:

 Begin Tran Update titles set royalty = 0 Rollback 

Der Rollback rollt den Batch zurück in die äußerste Transaktion, obwohl es eine abgeschlossene Transaktion (2) auf Titelautoren gibt. Der Rollback auf die abgeschlossene Transaktion erfolgt, da die abgeschlossene Transaktion als verschachtelte Transaktion behandelt wird.

Um diese Art von Problem zu vermeiden, überprüfen Sie nach jeder Transaktion, um zu sehen, ob die Transaktion abgeschlossen ist, indem Sie die folgende statement verwenden:

 If @@trancount > 0 rollback 

reference: Unvollständige Transaktion kann eine große Anzahl von Sperren enthalten und eine Blockierung verursachen