Ist es möglich, nur geschachtelte Transaktion für Autotesting zurückzusetzen

Betrachten Sie den folgenden Code:

ExecuteSQL("UPDATE ..."); using (var t = new TransactionScope()) { ExecuteSQL("UPDATE ..."); if (SomeCondition) t.Commit(); else t.Rollback(); } var result = ExecuteSQL("SELECT ..."); 

Dann schreiben wir einen automatischen Test mit dem äußeren TransactionScope, um Änderungen nach jedem Test zurückzusetzen:

 [TestInitialize] public override void Initialize() { _transaction = new TransactionScope(); } [TestCleanup] public override void Cleanup() { _transaction.Dispose(); } 

Es ist nicht möglich, einen korrekten Test für einen Fall zu schreiben, wenn SomeCondition falsch ist . Da die verschachtelte Transaktion ROLLBACK die gesamte äußere Transaktion mit der ersten UPDATE-statement zurückgibt.

Kennen Sie irgendwelche Workarounds?

Nein. Sie können zu einem Sicherungspunkt zurückkehren, siehe exceptionbehandlung und verschachtelte transactions, aber das ist nicht dasselbe wie das, was Sie wollen.

Was hast du wirklich zu erreichen? Die Prüfung sollte unter ähnlichen Bedingungen der Produktion erfolgen. Hinzufügen einer uber Transaktion und Testmethoden in inneren transactions ist nichts wie, wie sich das System in der Produktion verhalten würde.

SQL server unterstützt keine verschachtelten transactions. Es hat nur eine Transaktion, die mehrere start transaction statementen gesehen hat, und erfordert mehrere commit transaction statementen, bevor es wirklich verpflichtet.

Als Workaround, nest nicht die transactions. Es ist möglich, zwei transactions gleichzeitig auf verschiedenen Verbindungen auszuführen.

Unbenannte Rollback rollt alle Thansactions zurück bis an die Spitze des Stacks.

Das einzige, was helfen kann, ist, namens SAVE TRANSACTION zu verwenden

Warnung : functioniert nicht mit verteilten transactions.