Ich habe die folgende Situation:TransactionScope mit MySQL und Lesesperre verwenden
Wenn eine MySQL-Datenbank mit einer InnoDB-Tabelle, die ich verwenden, um eindeutige Zahlen zu speichern. Ich starte eine Transaktion, lese den Wert (zB 1000471), speichere diesen Wert in einer anderen Tabelle und aktualisiere den inkrementierten Wert (100472). Jetzt möchte ich vermeiden, dass jemand anderes den Wert liest, während meine Transaktion läuft.
Wenn ich Ebene MySQL verwenden würde ich so etwas tun würde:
Exceute ("LOCK Tbl1 READ");
Execute ("SELECT ... from tbl1");
Ausführen ("INSERT in tbl2");
Ausführen ("UNLOCK TABLES");
Da ich aber SubSonic als DAL benutze und der Code unabhängig von mysql sein soll, muss ich TransactionScope verwenden.
Mein Code:
TransactionOptions TransOpt = new TransactionOptions();
TransOpt.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
TransOpt.Timeout = new TimeSpan(0, 2, 0);
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew, TransOpt))
{
// Select Row from tbl1
// Do something
ts.Complete();
}
Nach der Hilfe von TransactionOptions
system.transactions.isolationlevel
Der Effekt, den ich erreichen will, mit IsolationLevel.ReadCommitted umgesetzt werden könnte, aber ich kann immer noch die Zeile lesen von außerhalb der Transaktion (Wenn ich versuche, es zu ändern, bekomme ich eine Sperre, so dass die Transaktion funktioniert)
Tut anyb ody hat einen Vorschlag? Ist eine Lesesperre sogar möglich mit TransactionScope
Beachten Sie, dass Sie bei Verwendung von TransactionScope mit einem Remote-MySQL-Server einen Distributed Transaction Coordinator auf dem lokalen und dem Remotecomputer benötigen. –
Das ist nicht wahr, DTC wird benötigt a) wenn die Implementierung es benötigt b) immer wenn Sie mehr als eine Transaktion i.g. (TransactionScope ts = neue TransactionScope()) {- löschen Sie eine Datei (auf Vista-Dateioperationen Unterstützung TransactionScope) - Wählen Sie * aus Tabelle auf Server 1 - In Tabelle auf Server 2 einfügen - Löschen aus Tabelle auf Server 1} –