sql-server - uncommitted - mongoose transaction




Verschachtelte Transaktionen in Sql Server (4)

Stellen Sie sich das folgende Szenario vor:

Ich verwende SQL Server 2005. Ich habe eine Transaktion, die neben anderen SQL-Anweisungen eine gespeicherte Prozedur aufruft, in der sich auch eine Transaktion befindet. Die äußere Transaktion schlägt manchmal fehl und es wird zurückgesetzt, nachdem die gespeicherte Prozedur erfolgreich aufgerufen und festgeschrieben wurde.

Meine Frage ist, Rollback der gespeicherten Prozedur der Transaktion?


Absolut ja, die Transaktion der obersten Ebene wird alle Datenänderungen besitzen, bis sie festgeschrieben oder zurückgesetzt wird.

Ich möchte Sie jedoch ermutigen, über das Transaktionsmodell nachzudenken. Je mehr solche Szenarien in Ihrem System vorhanden sind, desto größer sind Ihre Probleme mit Sperren. Auch der Rechenaufwand des Verfahrens steigt.

Es ist bemerkenswert, wie oft ich bei der Rationalisierung von SQL Transaktionen gefunden habe, wo sie gerade nicht benötigt werden. Ich ermutige Sie (und jeden, der mit Transaktionen arbeitet), sorgfältig darüber nachzudenken, warum Sie sie in jedem Kontext verwenden und was passieren würde, wenn die Transaktion nicht umgesetzt würde. Nur mein 2c Wert!


Bei einer verschachtelten Transaktion schreibt ein Commit außer der Transaktion auf der obersten Ebene keine Änderungen auf den Datenträger. Ein Rollback funktioniert jedoch unabhängig von der Ebene der Transaktion, also ja, es wird die innere Transaktion zurückrollen.


Ich habe versucht mit begin tran und commit innerhalb der gespeicherten Prozedur sagen usp_test.
Führen Sie diese SP mit einer anderen Abfrage wie unten aus

update x set name='xxx'
select * from x---contains 'xxx'
begin tran
update x set name='yyy'
select * from x---contains 'yyy'
exec usp_test
select * from x---contains 'zzz' inside the sp
rollback tran

Bei der Ausführung der oben genannten Abfrage Name in x-Tabelle muss "xxx" sein nicht "zzz" seit dem ersten Start trollbacked sogar die SP tranCommit.
Also, beginne zuerst die Datenänderungen zu übernehmen.






transactions