0

Ich habe eine WinForm-Anwendung, die SqlServer CE 3.5 als Datenbank verwendet. Ich verwende typisierte Dataset-Abfragen für db-Operationen. Ich muss Transaktionen für diese Operationen verwenden. Das Problem ist, dass sie auf verschiedene Baugruppen verteilt sind. Meine Frage ist, was soll ich verwenden, um alle in einer einzigen Transaktion auszuführen? Hier ist ein Beispiel-Betrieb:Aktuelle Transaktion übergeben oder DependentClone verwenden?

//transaction should start here 
this.QueryDb(); 
MyOtherAssembly.myClass.QueryDbForSomethingElse(); 
System.IO.File.Delete(fileName); 
//end transaction 

Ich denke an TransactionScope verwenden, aber es wäre in dieser Situation arbeiten? Ich meine würde QueryDbForSomethingElse() Rollback, wenn File.Delete() fehlschlägt? Sollte ich Transaction.Current oder Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete) als Parameter übergeben und eine neue Transaktion dort mit übergebenen Parameter erstellen?

Ich würde mich über irgendwelche Ideen dazu freuen.

Antwort

0

TransactionScope funktioniert über Baugruppen - es ist wirklich egal wo der Code implementiert ist. Es ist vielmehr an den aktuellen Ausführungskontext gebunden (der aktuelle Thread, wenn ich mich nicht irre).

Das Windows-Dateisystem ist jedoch nicht transaktional, so dass Dateivorgänge unabhängig davon, wie Sie Ihren Code in einer Transaktion registrieren, keine Rolle spielen. Bis wir ein transaktionales Dateisystem erhalten, können Sie keine Anwendung schreiben, die ACID-Transaktionen garantiert, wenn Dateioperationen involviert sind.

Stattdessen müssen Sie explizit kompensierende Aktionen implementieren.

FWIW, jedoch können Sie einen Blick auf Juval Lowy MSDN Magazin Artikel Can't Commit? Volatile Resource Managers in .NET Bring Transactions to the Common Type werfen.

+0

Danke. Ich hätte klarer sein und hinzufügen, dass ich keine transaktionale Datei löschen muss und meine Operationen sind nicht Multi-Threading. – dstr

Verwandte Themen