7

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

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


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

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

编辑

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

4

2 回答 2

6

您是对的:将连接返回到池时不会重置隔离级别。这是可怕的行为,但我们坚持下去......

有两种策略:

  1. 在返回之前重置隔离级别:这是您的方法。
  2. 始终使用带有显式事务(或 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

这对你有用吗?

于 2013-02-19T12:47:05.373 回答
3

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

这样,TransactionScope 连接就不会与其他连接合并。

于 2013-10-14T16:23:41.927 回答