完成事务后更改TransactionScope IsolationLevel

时间:2013-02-19 12:19:21

标签: c# transactions transactionscope

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

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


using (var transaction = new TransactionScope(TransactionScopeOption.Required,options))
{
    transation.Complete();
}

现在执行结束后,我想更改TransactionScopeIsolationLevel。

修改

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

2 个答案:

答案 0 :(得分:5)

您说得对:返回池连接时不会重置隔离级别。这是一种可怕的行为,但我们坚持不懈......

有两种策略:

  1. 在返回之前重置隔离级别:这是您的方法。
  2. 始终使用与显式事务(或TransactionScope)的连接,以确保隔离级别。
  3. 我建议你做后者。

    如果您坚持做(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
    

    这对你有用吗?

答案 1 :(得分:2)

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

这样,TransactionScope连接不与其他连接汇集。