2

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

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

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

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

是否有任何方法来重置隔离级别,而无需在对数据库的所有调用中明确设置它,以防万一此代码之前已运行过?

4

2 回答 2

4

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

于 2013-08-09T12:49:53.953 回答
2

不久前我关心这个问题。简短的回答:没有好的解决方案。我认为现在最好的做法是在显式事务下执行所有内容,因为这为您提供了有保证的隔离级别。永远不要使用隐式事务。

于 2013-08-09T14:22:42.337 回答