c# - 自定义事务实现 - 线程和锁

标签 c# multithreading transactions locking thread-safety

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

最佳答案

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

关于c# - 自定义事务实现 - 线程和锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9919789/

相关文章:

java - Hibernate - 删除对象

c# - 构建通用应用程序 - 允许客户特定的选项

java - 具有优先级设置的线程

c# - C# Parallel.ForEach 是否对集合的迭代使用相同的线程

Java 线程同步 - Thread.sleep() 方法未按预期工作

java - 传递给 List 的 ArrayAdapter 的 arraylist 应该是线程安全的吗?

c# - 在 Entity Framework Core 的不同方法中使用相同的事务

hibernate - 第二个数据库操作卡住事务中的执行

c# - 从 WaveStream 将 2 channel 样本读入数组的最简单方法

c# - 如何在 EF Core 2.2 中进行原始 SQL 查询?