【问题标题】:Need help to use transaction scope需要帮助使用事务范围
【发布时间】:2016-10-22 14:14:13
【问题描述】:

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

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,让我们在每次执行选择命令时创建新事务。需要帮助才能前进。我们使用 SQL Server 作为数据源。如果我们将其更改为RequiredNew,那么由于将对应用程序中的所有选择实体命令进行此更改,对性能有何影响?

【问题讨论】:

  • 你的问题到底是什么?
  • @WicherVisser 可以将TransactionScopeOption.Suppress 更改为TransactionScopeOption.RequiredNew

标签: c# sql-server deadlock transactionscope isolation-level


【解决方案1】:

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

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

您需要加入Ambient 事务或创建一个新事务到IsolationLevel.ReadUncommitted

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

编辑
简答:在某种程度上

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

不同版本的 SQL Server 以不同的方式处理这种升级, SQL Server 2008 不会升级,除非两个连接同时打开,而以前的版本总是在多个连接上升级。

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

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

【讨论】:

  • Microsoft Distributed Transaction Coordinator 在其中扮演什么角色吗?
  • @AnkushMadankar 添加了我的想法来回答
  • 如果我们将事务范围更改为RequiredNew,您能否给出您对性能的看法。因为此更改将适用于在整个应用程序中具有选择实体命令的所有调用。
【解决方案2】:

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

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

使用RequiredNew 有意义吗?很可能不会,因为它为每个事务创建了一个 always 事务范围,而不是重复使用范围。缺点在this SO post 中提到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2015-08-09
    • 1970-01-01
    相关资源
    最近更新 更多