2012-03-29 12 views
2

私はSQLiteでいくつかのことをやっていて、私は "トランザクション"中にスレッドをブロックしたい。以下のコードは正しく動作しますか?私はこのケースで開かれたトランザクションを持っている場合は、スレッドが正しいBeginTransaction方法をカスタムトランザクションの実装 - スレッディングとロック

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); 
    } 
} 

入ることができませんか?

答えて

2

はい、次のコードは動作しますが、ロッカーインスタンスが静的ですべてのインスタンスで共有されているため、複数の接続で作業すると誤動作します。 SQLトランザクションが同期を提供しているので、なぜ静的に同期されたロッカーインスタンスが必要なのかわかりません。ですから、transaction_lockから静的な部分を削除するだけでよいのです!

+0

@Groo - SQL Liteの専門家ではないことを私に許してください:)しかし、SqlLiteトランザクションは、競合状態から保護するために、並行接続で書き込みしようとしていますか? – Polity

+0

申し訳ありませんが、私はこれを考えていませんでした。はい、SQLiteはスレッドセーフです。しかし、私はどんな場合でも 'TRANSACTION_LOCK'を非公開にします。 – Groo

関連する問題