需要帮助以使用交易范围
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
的方式更改为更可靠的推荐模式以避免出现问题。
我正在研究应用程序死锁的分析和预防措施,我发现了以下事务范围代码行:
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
的方式更改为更可靠的推荐模式以避免出现问题。