使用Transaction Scop时重置隔离级别

时间:2013-08-09 12:38:47

标签: c# transactions transactionscope

我们将隔离级别设置为Read Uncommitted,如下所示。

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

问题是一旦连接返回到池,它就不会重置回默认的隔离级别,我理解这是设计的(The transaction isolation level is not reset when you reuse a connection from the connection pool)。因此,当事务完成时,从池中重用该连接的任何内容都将以Read Uncommitted隔离级别运行。

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

是否有重置隔离级别而没有在所有对DB的调用中明确设置它以防万一此代码已经运行过?

2 个答案:

答案 0 :(得分:4)

对于在此事务范围内使用的连接,我会使用不同的connection string(可能是一个将Pooling设置为false,或只是将应用程序名称设置为fiddles)。这样,此连接最终会在(不同的)池中与其他连接相连,并且不会被其他代码意外地接收。

答案 1 :(得分:2)

I concerned myself with this problem a while ago.简短回答:没有好的解决方案。我认为现在最好的做法是在显式事务下执行所有操作,因为它为您提供了有保证的隔离级别。永远不要使用隐式交易。