需要帮助使用事务范围

4

我正在分析和预防应用程序中的死锁问题,发现以下代码行用于事务范围:

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,那么性能影响将是什么,因为此更改将针对应用程序中的所有选择实体命令进行?

你的问题具体是什么? - Wicher Visser
@WicherVisser:TransactionScopeOption.Suppress 可以改成 TransactionScopeOption.RequiredNew 吗? - Ankush Madankar
2个回答

4
如果您真的想允许IsolationLevelReadUncommitted,那么就不应该使用TransactionScopeOption.Suppress。使用TransactionScopeOption.Suppress将不参与任何事务,而IsolationLevel始终默认为数据库的默认值,在SQL Server中为IsolationLevel.ReadCommitted
您需要加入一个Ambient事务或创建一个新事务以使用IsolationLevel.ReadUncommitted。因此,如果您愿意进行脏读取操作,可以将其更改为TransactionScopeOption.RequiredNew
编辑
简短回答:有点这样
长回答:
在单个TransactionScope中连接到数据库多个连接会导致升级到MS DTC。不同版本的SQL Server以不同的方式处理此升级。 SQL Server 2008仅在两个连接同时打开时才会升级,而以前的版本则总是在多个连接上升级。
确保您没有在单个TransactionScope中具有多个连接,这样您就没问题了。但看到您的代码,您已经打开了多个连接并且创建了MS DTC升级。
使用RequiresNew表示始终创建一个新的TransactionScope,即使包含在Ambient范围内,这几乎总会创建死锁和超时问题,如果没有得到适当处理。您最好的选择是更改访问DB的方式,以避免问题。

Microsoft Distributed Transaction Coordinator 在其中扮演任何角色吗? - Ankush Madankar
@AnkushMadankar,我在回答中添加了我的想法。 - Vishnu Prasad V
如果我们将事务范围更改为“RequiredNew”,您能否就性能提出您的想法?由于此更改将应用于整个应用程序中具有选择实体命令的所有调用。 - Ankush Madankar

2
我不确定我理解您的问题。
如果您的意思是询问是否可以在编程时为事务范围使用RequiredNew作用域选项,那么是的,这是可能的:

enter image description here

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接