Die Frage bezieht sich ausschließlich auf die Rückgängigmachung der Änderungen, nicht auf das Commit.
Angenommen, ich rufe einige Daten ab, ändere sie, übermittle die Änderungen (optionaler Schritt) und führe die Transaktion zurück. Wo auch immer Sie hinschauen, jeder Autor schreibt, dass dies die Änderungen rückgängig macht.
Aber ich habe herausgefunden, dass das nur halb wahr ist - LINQ DataContext behält die geänderten Daten! Ich habe dies mit TransactionScope und DataContext.Transaction getestet. In beiden Fällen erhielt ich das gleiche Verhalten.
Eine Abhilfe wäre, den DataContext nach dem Rollback neu zu erstellen (dies führt jedoch zu anderen Problemen wie der Zwischenspeicherung von Daten und der Handhabung verschachtelter Transaktionen) oder die Änderungen im DataContext manuell zu verwerfen. Dies sind jedoch nur Behelfslösungen.
Fragen
Was vermisse ich also? Ist LINQ to SQL nicht für Transaktionen geeignet? Wie kann man Transaktionen so verwenden, dass sie WIRKLICH Änderungen rückgängig machen?
Beispiel
MyTable record = null;
db.Connection.Open();
using (db.Transaction = db.Connection.BeginTransaction())
{
record = db.MyTable.First();
record.BoolField = !record.BoolField; // changed
db.SubmitChanges();
db.Transaction.Rollback();
}