使用事务作用域时重置隔离级别
本文关键字:隔离级 事务 作用域 | 更新日期: 2023-09-27 18:26:56
我们将隔离级别设置为Read Uncommitted,如下所示。
TransactionOptions to = new TransactionOptions();
to.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.RequiresNew, to))
{
// Do Stuff
transaction.Complete();
}
问题是,一旦连接返回到池中,它就不会重置回默认的隔离级别,据我所知,这是经过设计的(当您重用连接池中的连接时,事务隔离级别不会重置)。因此,当事务完成时,任何从池中重用该连接的东西都将以读取-未提交隔离级别运行。
我尝试过使用SqlCommand调用"SET TRANSACTION ISOLATION LEVEL READ COMMITTED"
,但无法保证它会重用池中的相同连接。// Do Stuff
中没有任何内容公开底层连接。
有没有办法重置隔离级别,而不在所有对DB的调用中显式设置它,以防以前运行过此代码?
我会为您在此事务范围内使用的连接使用不同的连接字符串(可能会将Pooling设置为false,或者只是篡改应用程序名称)。这样,这个连接最终会与其他连接在(一个不同的|no)池中,并且不会被其他代码意外获取。
我刚才关心这个问题。简言之:没有好的解决方案。我认为现在最好的做法是在显式事务下执行所有内容,因为这为您提供了一个有保证的隔离级别。永远不要使用隐式事务。