2012-03-29 3 views
2

저는 SQLite로 몇 가지 작업을하고 있습니다. 트랜잭션 중일 때 스레드를 차단하고 싶습니다. 아래 코드가 올바르게 작동합니까? 나는이 경우 트랜잭션이 열려있는 경우커스텀 트랜잭션 구현 - 스레딩 및 잠금

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

, 어떤 스레드는 BeginTransaction 방법 올바른을 입력 할 수 없습니다?

답변

2

예, 다음 코드는 작동하지만 사물함 인스턴스가 고정되어 모든 인스턴스가 공유하므로 여러 연결로 작업 할 때 오작동합니다. SQL 트랜잭션이 이미 동기화를 제공하므로 정적으로 동기화 된 로커 인스턴스가 필요한 이유는 알 수 없습니다. 그래서 : transaction_lock에서 정적 부분을 제거하면됩니다.

+0

@ 그루 - SQL 라이트 전문가가 아니기 때문에 저를 용서해주십시오.) 그러나 동시 연결이 쓰려고 할 때 경합 조건을 보호하기 위해 SqlLite 트랜잭션을 거기서 보내지 않으십니까? – Polity

+0

죄송합니다. 나는 이것을 생각하지 않았습니다. 예, SQLite는 쓰레드에 안전한 thread입니다. 그러나 나는 어떤 경우에도'TRANSACTION_LOCK'을 private으로 만들 것입니다. – Groo