【问题标题】:Reset Isolation level when using Transaction Scop [duplicate]使用事务范围时重置隔离级别[重复]
【发布时间】:2013-08-11 09:29:54
【问题描述】:

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

    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)。因此,当事务完成时,任何从池中重用该连接的东西都将以未提交的读取隔离级别运行。

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

是否有没有在所有调用数据库时显式设置隔离级别的情况下重置隔离级别,以防万一之前运行过此代码?

【问题讨论】:

    标签: c# transactions transactionscope


    【解决方案1】:

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

    【讨论】:

    • 这是我们使用的方法。像附加空格这样“简单”的东西会使连接字符串“不同”,从而落入不同的池中。代码检查环境范围隔离以确定使用哪个 CS。它无论如何都不完美,但总比没有好..
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2013-11-20
      • 2011-06-05
      • 1970-01-01
      相关资源
      最近更新 更多