使用TransactionScope需要新的缺点

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

问候。

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

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

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

一般来说,虽然我同意它没有必要,应该使用read committed。

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