C# 完成事务后更改TransactionScope IsolationLevel

C# 完成事务后更改TransactionScope IsolationLevel,c#,transactions,transactionscope,C#,Transactions,Transactionscope,在数据库中保存数据时,我使用TransactionScope,并将IsolationLevel设置为Serializable TransactionOptions options = new TransactionOptions { IsolationLevel=IsolationLevel.Serializable }; using (var transaction = new TransactionScope(Transaction

在数据库中保存数据时,我使用TransactionScope,并将IsolationLevel设置为Serializable

TransactionOptions options = new TransactionOptions
        {
            IsolationLevel=IsolationLevel.Serializable
        };


using (var transaction = new TransactionScope(TransactionScopeOption.Required,options))
{
    transation.Complete();
}
现在,在执行结束后,我想更改TransactionScopeIsolationLevel

编辑


我的理解是,如果将IsolationLevel设置为Serializable,那么在完成事务后,连接对象将关闭并返回到连接池,当其他请求到达时,它将从池中获取该连接对象,从而受前一个IsolationLevel的影响。因此,我希望在每次事务完成后将隔离级别更改为默认值。

你说得对:在将连接返回到池时,不会重置隔离级别。这是一种可怕的行为,但我们仍然坚持下去

有两种策略:

  • 在返回之前重置隔离级别:这是您的方法
  • 始终使用带有显式事务(或TransactionScope)的连接,以保证隔离级别
  • 我建议你做后者

    如果您坚持执行(1),您只需在关闭
    TransactionScope
    后更改隔离级别,但您必须对连接对象执行此操作。例如:

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        using (var transaction = new TransactionScope(TransactionScopeOption.Required,options))
        {
            connection.Open(); //open inside of scope so that the conn enlists itself
            transation.Complete();
        }
        //conn is still open but without transaction
        conn.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL XXX"); //pseudo-code
    } //return to pool
    

    这对你有用吗?

    我被它咬了一口。幸运的是,连接字符串逻辑是集中的。如果Transaction.Current不为null(这意味着我们在TransactionScope中),我所做的就是更改连接字符串的应用程序设置


    这样,TransactionScope连接就不会与其他连接共用。

    感谢您的回复,我准备接受其他更好的选择,但根据您的建议,使用显式事务打开所有连接,您不认为这会给系统带来大量开销吗。我有一个巨大的应用程序,有数百个端点,但我使用TransactionScope的场景只有几个。对于这样的事情,你有什么建议?事务开销几乎没有,因为所有语句都使用隐式事务。;如果您不能迁移所有内容,那么您的方法实际上可能是一个好主意。一个黑客,但一个务实的解决方案。我看不出它有什么大问题;工作有人试过吗?@Hazimdekenl我肯定有