使用事务范围时重置隔离级别

3
我们将隔离级别设置为“读未提交”,如下所示。
    TransactionOptions to = new TransactionOptions();
    to.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
    using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.RequiresNew, to))
    {
       // Do Stuff
       transaction.Complete();
    }

连接被返回到池中后,问题在于它不会被重置回默认的隔离级别,我理解这是设计上的问题(当您重用连接池中的连接时,事务隔离级别不会被重置)。因此,当事务完成后,从池中重用该连接的任何内容都将使用Read Uncommitted隔离级别运行。
我尝试使用SqlCommand调用“SET TRANSACTION ISOLATION LEVEL READ COMMITTED”,但无法保证它将重用来自池的相同连接。在// Do Stuff中没有任何东西暴露底层连接。
有没有办法在不显式设置所有与数据库的通话时重置隔离级别的情况下重置隔离级别,以防此代码之前已运行?
2个回答

5

我会使用不同的连接字符串(可能是将Pooling设置为false,或者只是调整应用程序名称)来连接在此事务范围内使用的连接。这样,该连接就会进入(不同的|没有)池中,不能被其他代码意外地获取。


这是我们使用的方法。像添加空格这样“简单”的操作会使连接字符串“不同”,从而落入不同的池中。代码检查环境作用域隔离以确定使用哪个 CS。它并非完美无缺,但总比一无所获要好。 - user2864740

2

我曾经关注过这个问题。简短的回答是:没有好的解决方案。现在我认为最佳实践是在显式事务下执行所有操作,因为这样可以提供保证的隔离级别。不要使用隐式事务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接