编程语言
首页 > 编程语言> > c# – 需要帮助才能使用事务范围

c# – 需要帮助才能使用事务范围

作者:互联网

我正在为应用程序中的死锁进行分析和预防措施,在那里我找到了以下代码行的事务范围:

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 Server作为数据源.如果我们将其更改为RequiredNew,那么对应用程序中的所有选择实体命令进行此更改将会产生什么样的性能影响?

解决方法:

如果您确实希望允许IsolationLevel为ReadUncommitted,则不应使用TransactionScopeOption.Suppress.

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

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

因此,您肯定可以更改为TransactionScopeOption.RequiredNew以允许脏读,如果这是您想要的.

编辑
简答:在某种程度上

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

不同版本的SQL Server以不同方式处理此升级,
除非两个连接同时打开,否则S​​QL Server 2008不会升级,而以前的版本将始终在多个连接上升级.

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

使用RequiresNew意味着始终创建一个新的TransactionScope,即使它包含在Ambient Scope中.如果处理不当,这几乎总会产生死锁和超时问题.您最好的选择是将访问数据库的方式更改为更加经过验证的推荐模式,以避免出现问题.

标签:c,sql-server,transactionscope,deadlock,isolation-level
来源: https://codeday.me/bug/20190527/1166478.html