Реализация пользовательских транзакций - многопоточность и блокировки - PullRequest
2 голосов
/ 29 марта 2012

Я делаю кое-что с 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?

1 Ответ

3 голосов
/ 29 марта 2012

Да, следующий код будет работать, но он будет некорректно работать при работе с несколькими соединениями, так как ваш экземпляр блокировщика статичен и поэтому используется всеми экземплярами. Я не понимаю, зачем вам статически синхронизированный экземпляр локера, так как транзакция sql уже обеспечивает синхронизацию. Итак: просто удалите статическую часть из транзакции и все готово!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...