Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum wird eine verschachtelte Transaktion festgeschrieben, selbst wenn TransactionScope.Complete() nie aufgerufen wird?

Zunächst einmal gibt es keine verschachtelten Transaktionen in SQL Server . Das ist wichtig.

Zweitens verwenden beide TransactionScopes conn1, sodass Sie (auf SQL Server-Ebene) @@TRANCOUNT inkrementieren für jede BEGIN TRANSACTION

Einfache Erklärung:Die innere Transaktion wird festgeschrieben, wenn die äußere Transaktion festgeschrieben wird, da ein Zurücksetzen der inneren Transaktion beide rückgängig machen würde Transaktionen

Das heißt, COMMIT TRANSACTION (impliziert durch .Complete und .Dispose ) verringert @@TRANCOUNT während ROLLBACK TRANSACTION (impliziert durch .Dispose nur) nimmt es auf Null zurück. Das innere Rollback wird also unterdrückt, weil "es keine verschachtelten Transaktionen gibt"

Wenn Sie conn2 im inneren Bereich korrekt verwendet hätten, würde es wie erwartet funktionieren, da die beiden Transaktionen auf Datenbankserverebene nicht miteinander verbunden sind. Worauf es ankommt...