使用TransactionScope需要新功能的缺点

时间:2011-04-22 22:10:32

标签: c# .net sql entity-framework

我想了解在 EntityFramework w / Sql Server 2008 )上使用TransactionScopeOption.RequiresNew的交易/缺点是什么,原因是什么为什么我们不应该总是使用RequiresNew

问候。

2 个答案:

答案 0 :(得分:23)

您应该使用Required而不是RequiresNew。 RequiresNew意味着每个操作都将使用新事务,即使存在包含已存在的事务范围。这肯定会导致僵局。即使使用RequiredTransactionScope还存在另一个严重问题,即它默认创建一个Serializable事务,这是一个非常糟糕的选择,也是死锁地狱的另一个捷径,没有可扩展性。见using new TransactionScope() Considered Harmful。您应该始终使用显式TransactionOption创建一个事务范围,将隔离级别设置为ReadCommitted,这是一个更加理智的隔离级别:

using(TransactionScope scope = new TransactionScope(
    TransactionScopeOption.Required,
    new TransactionOptions {
       IsolationLevel = IsolationLevel.ReadCommitted}))
{
   /// do work here
   ...
   scope.Complete();
}

答案 1 :(得分:1)

我只是想在这里补充一点,在某些情况下,我编写的方法是在父事务范围内,在这些情况下我可能不会被scope.Complete()关闭或不关闭依赖于父事务,所以我们需要设置RequiresNew。

总的来说,虽然我同意这不是必要的,应该使用read committed。

http://msdn.microsoft.com/en-us/library/ms172152(v=vs.90).aspx