我想了解在 EntityFramework ( w / Sql Server 2008 )上使用TransactionScopeOption.RequiresNew
的交易/缺点是什么,原因是什么为什么我们不应该总是使用RequiresNew
。
问候。
答案 0 :(得分:23)
您应该使用Required
而不是RequiresNew
。 RequiresNew意味着每个操作都将使用新事务,即使存在包含已存在的事务范围。这肯定会导致僵局。即使使用Required
,TransactionScope
还存在另一个严重问题,即它默认创建一个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