【问题标题】:Custom Transaction implementation - Threading and Locks自定义事务实现 - 线程和锁
【发布时间】:2012-03-29 05:54:11
【问题描述】:

我正在用 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方法对吗?

【问题讨论】:

    标签: c# multithreading transactions locking thread-safety


    【解决方案1】:

    是的,以下代码可以工作,但在处理多个连接时会出现异常,因为您的储物柜实例是静态的,因此由所有实例共享。我不明白为什么你会想要一个静态同步的储物柜实例,因为 sql 事务已经提供了同步。所以:只需从 transaction_lock 中删除静态部分就可以了!

    【讨论】:

    • @Groo - 请原谅我不是 sql lite 专家 :) 但是 SqlLite 事务不是在并发连接尝试写入时保护免受竞争条件的影响吗?
    • 对不起,我没有想到这一点。是的,SQLite 对于编写来说是线程安全的。但是,无论如何,我都会将TRANSACTION_LOCK 设为私有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多