需要帮助以使用交易范围

Need help to use transaction scope

我正在研究应用程序死锁的分析和预防措施,我发现了以下事务范围代码行:

var tranaction = new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted };

// TransactionScopeOption.Required changed to Suppress for 2 tier issue with MSDTC
using (var transactionScope = new TransactionScope(TransactionScopeOption.Suppress, tranaction))
{
   //Select entity command.
}

我们只有一些 select 允许脏读操作的实体语句。 我已经阅读了一些关于 TransactionScopeOption 的资源,但在这里我找不到确切的 TransactionScopeOption 在这种情况下,或者觉得我们可以将选项更改为 RequiredNew 并且让我们在每次 select 命令已执行。需要帮助才能前进。我们使用 SQL 服务器作为数据源。如果我们将其更改为 RequiredNew 那么性能会受到什么影响,因为此更改将针对应用程序中的所有 select 实体命令完成?

我不确定我是否理解你的问题。

如果您想以编程方式询问是否可以为您的交易范围使用 RequiredNew 范围选项,那么是的,这是可能的:

使用RequiredNew有意义吗?很可能不是,因为它为每个事务创建一个事务范围 always,而不是重复使用范围。 this SO post.

中提到了缺点

如果你真的想让IsolationLevel变成ReadUncommitted,那么你不应该使用TransactionScopeOption.Suppress

TransactionScopeOption.Suppress 的使用不会参与任何 Transaction 并且 IsolationLevel 始终默认为 SQL 服务器中的数据库默认值 IsolationLevel.ReadCommitted .

您需要加入 Ambient 交易或为 IsolationLevel.ReadUncommitted 创建新交易。

因此,如果需要,您绝对可以更改为 TransactionScopeOption.RequiredNew 以允许脏读。

编辑
简短回答:在某种程度上

长答案:
升级到 MS DTC 是在单个 TransactionScope 中与 DB 建立多个连接的结果。

不同版本的SQL服务器以不同的方式处理这种升级, SQL Server 2008 除非同时打开两个连接,否则不会升级,而以前的版本将始终在多个连接上升级。

确保您没有在一个 TransactionScope 中有多个连接,您应该没问题。但是通过查看您的代码,您已经打开了多个连接并创建了 MS DTC 升级。

使用 RequiresNew 意味着总是创建一个新的 TransactionScope,即使这包含在 Ambient 范围内。如果处理不当,这几乎总是会造成死锁和超时问题。您最好的选择是将您访问 DB 的方式更改为更可靠的推荐模式以避免出现问题。