2009-04-21 4 views
0

Ich bin beschäftigt, eine Software-Update-Anwendung in C#, WinForms, .NET 3.5 zu erstellen, wo ich eine Sammlung von Pluggable-Aufgabenklassen mit einer gemeinsamen Basisklasse habe. Ich möchte, dass eine Aufgabe, die Datenbankaktualisierung, mit einer Transaktion beginnt und eine andere Aufgabe, das Website-Upgrade, die gleiche Transaktion festschreibt oder zurücksetzt, sodass die Website und die Datenbank immer synchronisiert sind.Wie überspreche ich eine Transaktion über zwei unabhängige oder entkoppelte Methodenaufrufe?

Ich erinnere mich vage an Sachen aus meinen VB6-Tagen, an denen eine COM + -Methode in eine Transaktion eingebunden werden konnte, wenn eine bereits ausgeführt wurde, oder wenn nicht, etc. Ich habe auch vage Erinnerungen an diese Portierung an .NET Enterprise Services Das war auch schon eine Weile her.

Was ist die aktuelle Technologie, um dies zu erreichen?

Antwort

1

Aus der Spitze meines Kopfes, ich denke, dass Sie in der Lage sein sollten, dies ohne spezielle Technologie zu tun. Erstellen Sie eine UpgradeManager-Klasse, die sowohl für die Datenbank- als auch für die Web-Upgrades verantwortlich ist. Die Transaktion sollte hier leben und die Anrufe in die zwei anderen Objekte umgeben heißen.

Wenn Sie andere Aufgaben haben, die Sie anschließen möchten, lassen Sie den UpgradeManager über eine Sammlung Ihrer Aufgaben iterieren.

..... oder Sie könnten die Transaktion herumreichen, wie Harpo sagte (seine Antwort kam in der Mitte meines Komponierens) ... gut Optionen zu haben. ;-)

Nate

+0

Dank suchen, ich habe jetzt eine Vorstellung von Transaktions Sachen an die Aufgabe Objekte als Dienst in ihrem Behälter ausgesetzt wird. – ProfK

3

Vielleicht möchten Sie hier beginnen.

http://msdn.microsoft.com/en-us/library/86773566.aspx

SqlConnection.BeginTransaction liefert einen SqlTransaction, die IDbTransaction implementiert.

Die beiden für IDbTransaction definierten Methoden sind Commit() und Rollback(). Wenn Sie das Verbindungsobjekt zwischen den Aufrufen am Leben erhalten, sollten Sie in der Lage sein, die Transaktion von einem Ort zu einem anderen zu übergeben und das Commit oder Rollback dort durchzuführen.

Wenn Sie nicht SQL Server verwenden, stellt Ihr Datenbankanbieter (OleDb, Odbc usw.) ein entsprechendes Objekt bereit.

4

Ich glaube, Sie für environment transactions, or implicit transactions

using (TransactionScope scope = new TransactionScope()) 
{ 
    // do several stuff in the same transaction 
    // calls in here implicitly are in the scope of the transaction. 
    // you open several independent connections, which are in the same transaction. 
} 
+0

Haben Sie das überprüft? –

+2

+1 das ist, was Transaktionsbereich für –

+0

entworfen wurde Dies ist eigentlich die richtige Antwort. Dies verwendet Ambient-Transaktionen. Dies ist der MSDN-Link für [TransactionScope] (https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396) jemand interessiert – Vort3x