使用 Transaction Scope 时重置隔离级别

Mat*_*att 3 c# transactions transactionscope

我们将隔离级别设置为“未提交读”,如下所示。

    TransactionOptions to = new TransactionOptions();
    to.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
    using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.RequiresNew, to))
    {
       // Do Stuff
       transaction.Complete();
    }
Run Code Online (Sandbox Code Playgroud)

问题是,一旦连接返回到池中,它就不会重置回默认隔离级别,我理解这是设计使然(当您重用连接池中的连接时,事务隔离级别不会重置))。因此,当事务完成时,任何重用池中连接的操作都将以读取未提交隔离级别运行。

我尝试"SET TRANSACTION ISOLATION LEVEL READ COMMITTED"使用 SqlCommand 进行调用,但无法保证它将重用池中的相同连接。没有任何内容// Do Stuff暴露底层连接。

无论如何,是否可以重置隔离级别,而无需在对数据库的所有调用上显式设置隔离级别,以防万一此代码之前已运行过?

Dam*_*ver 5

我会为您在此事务范围内使用的连接使用不同的连接字符串(可能是将 Pooling 设置为 false 的连接字符串,或者只是摆弄应用程序名称)。这样,该连接最终会出现在与其他连接不同的池中,并且不会意外地被其他代码拾取。