0

我正在尝试使用 System.Transaction.TransactionScope 创建一个事务来调用一些存储过程,但它似乎并没有自行清理。一旦事务完成(提交与否并且事务范围对象被释放),随后与数据库的连接将以可序列化的读取提交级别打开,而不是像通常那样进行读取提交。

我为每个调用打开和关闭一个连接(很好地关闭并返回到.NET 中的正常连接池),当我完成使用它进行事务处理时,我是否错过了一些显式重置连接的方法?我认为 System.Transaction.TransactionScope 背后的想法是隐藏所有复杂性。

所以我的代码如下所示:

            using (var scope = new TransactionScope())
            {
                ... make my 3 stored procedure calls ...

                scope.Complete();

                return returnCode;
            }

我想这是正常的做法。但是,如果我查看 sqlserver profiler,我可以看到正在打开的连接

set transaction isolation level serializable

这会扰乱随后的非事务相关数据库活动,而且显然也没有那么快。我可以通过设置一个事务选项来明确地使用 ReadCommited 进行事务来解决这个问题,但在我看来,这不是此操作的理想行为。

我还尝试显式创建一个 Commitabletransaction 对象,创建显式新事务而不是使用环境事务,但仍然没有运气。

任何有关如何解决此问题的想法都将不胜感激,因为如果他们尝试使用 readpast 锁定提示,任何使用可序列化连接的调用都会引发错误。

4

3 回答 3

1

使用TransactionOptions.IsolationLevel

默认情况下,它是可序列化的

TransactionOptions transactionoptions1 = new TransactionOptions();
transactionoptions1.IsolationLevel = IsolationLevel.ReadCommitted;
using (var scope = new TransactionScope(TransactionScopeOption.Required, transactionoptions1))
{
    ... make my 3 stored procedure calls ...

    scope.Complete();

    return returnCode;
}
于 2008-12-04T19:57:18.030 回答
0

您还应该看到sp_reset_connection池中同一连接的使用之间的重置();这不会重置隔离级别吗?您是否尝试过重现可序列化的问题(例如,锁升级死锁)

于 2008-12-04T09:39:46.903 回答
0

这是 SQL Server 中已知的设计决策。

此外,使用 new TransactionScope() 被认为是有害的(06/2010;避免使用默认构造函数)

于 2012-07-20T17:06:36.877 回答