我正在尝试使用 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 锁定提示,任何使用可序列化连接的调用都会引发错误。