Ich möchte mehrere Einfügeanweisungen für mehrere Tabellen ausführen. Ich benutze dapper.net. Ich sehe keine Möglichkeit, Transaktionen mit dapper.net abzuwickeln.
Bitte teilen Sie Ihre Ideen zur Verwendung von Transaktionen mit dapper.net mit.
c#
transactions
dapper
Amit
quelle
quelle
Dispose()
Methode. WennComplete()
nicht aufgerufen wurde, wird die Transaktion zurückgesetzt.TransctionScope
Verwendungsblocks geöffnet werden, falls Sie diese Antwort wählen.Ich habe es vorgezogen, einen intuitiveren Ansatz zu verwenden, indem ich die Transaktion direkt von der Verbindung erhalten habe:
quelle
.BeginTransaction()
haben? Wenn dies der Fall wäre, würde diese Erweiterungsmethode eine falsche Verwendung der Transaktion fördern. (IMO, es sollte sogar werfen "kann Transaktion nicht öffnen, nachdem die Verbindung bereits geöffnet ist".)Execute
, da dies erforderlich ist.Sie sollten in der Lage sein zu verwenden,
TransactionScope
da Dapper nur ADO.NET-Befehle ausführt.quelle
Da sich alle Ihre Tabellen in einer einzigen Datenbank befinden, bin ich mit der
TransactionScope
in einigen Antworten hier vorgeschlagenen Lösung nicht einverstanden . Verweisen Sie auf diese Antwort.TransactionScope
wird im Allgemeinen für verteilte Transaktionen verwendet; Transaktionen, die sich über verschiedene Datenbanken erstrecken, können sich auf verschiedenen Systemen befinden. Dies erfordert einige Konfigurationen unter Betriebssystem und SQL Server, ohne die dies nicht funktioniert. Dies wird nicht empfohlen, wenn sich alle Ihre Abfragen auf eine einzelne Datenbankinstanz beziehen.Bei einer einzelnen Datenbank kann dies jedoch hilfreich sein, wenn Sie den Code in eine Transaktion aufnehmen müssen, die nicht unter Ihrer Kontrolle steht. Bei einer einzelnen Datenbank sind auch keine speziellen Konfigurationen erforderlich.
connection.BeginTransaction
ist die ADO.NET-Syntax zum Implementieren von Transaktionen (in C #, VB.NET usw.) für eine einzelne Datenbank. Dies funktioniert nicht über mehrere Datenbanken hinweg.Also,
connection.BeginTransaction()
ist ein besserer Weg.Noch besser ist es, UnitOfWork zu implementieren, wie in dieser Antwort erläutert .
quelle
TransactionScope
die für das, was OP will, ineffizient ist. Ich bin damit einverstanden, dass diesTransactionScope
in vielen Fällen ein gutes Werkzeug ist. aber nicht das.Daniels Antwort funktionierte wie erwartet für mich. Der Vollständigkeit halber hier ein Ausschnitt, der Commit und Rollback anhand eines Transaktionsbereichs und eines Dappers demonstriert:
quelle
Dispose
Methode zuerst oder zweitens aufgerufen wird, nur dass sie zweimal aufgerufen wird. Was den Punkt betrifft, dass "ein zweites Mal Dispose nicht schädlich ist", ist dies eine große Annahme. Ich habe gelernt, dass die Dokumente und die tatsächlichen Implementierungen oft nicht übereinstimmen. Aber wenn Sie das Wort von Microsoft dafür wollen: msdn.microsoft.com/en-us/library/…