2012-03-29 2 views
2

Ich mache einige Sachen mit SQLite, und ich möchte, dass Threads blockieren, während ich in einer "Transaktion" bin. Funktioniert der folgende Code korrekt?Benutzerdefinierte Transaktionsimplementierung - Threading und Sperren

public class ThreadSafeSQLiteConnection 
{ 
    private readonly SQLiteConnection connection; 
    public static object TRANSACTION_LOCK = new Object(); 

    public void BeginTransaction() { 
     Monitor.Enter(TRANSACTION_LOCK); 
     connection.BeginTransaction(); 
    } 

    public void Commit() { 
     connection.Commit(); 
     Monitor.Exit(TRANSACTION_LOCK); 
    } 

    public void Rollback() { 
     connection.Rollback(); 
     Monitor.Exit(TRANSACTION_LOCK); 
    } 
} 

Wenn ich eine Transaktion offen in diesem Fall, können keine Threads BeginTransaction Methode korrekt eingeben?

Antwort

2

Ja, der folgende Code funktioniert, aber es wird sich beim Arbeiten mit mehreren Verbindungen falsch verhalten, da Ihre Schließfachinstanz statisch ist und daher von allen Instanzen gemeinsam genutzt wird. Ich sehe nicht, warum Sie eine statisch synchronisierte Schließfachinstanz wünschen würden, da die SQL-Transaktion bereits die Synchronisierung zur Verfügung stellt. Also: Einfach den statischen Teil aus dem transaction_lock entfernen und schon kann es losgehen!

+0

@Groo - verzeih mir, dass ich kein sql lite-Experte bin :) aber ist die SqlLite-Transaktion dort nicht zum Schutz vor race-Bedingungen, wenn gleichzeitige Verbindungen versuchen zu schreiben? – Polity

+0

Entschuldigung, ich habe das nicht durchdacht. Ja, SQLite ist Thread-sicher zum Schreiben. Ich würde jedoch den 'TRANSACTION_LOCK' auf jeden Fall privat machen. – Groo