了解TransactionScopeOptions:RequiresNew = Suppress + Required?

17

我相信我理解了TransactionScopeOption.SuppressTransactionScopeOption.Required,但是我很难理解TransactionScopeOption.RequiresNew的作用。根据我读过的最后一个解释,以下两个代码块的功能是否相同?这是否准确地表示了RequiresNew的含义?

using (var ts1 = new TransactionScope(TransactionScopeOption.RequiresNew))
{
  DoStuff();
  ts1.Complete();
}

using (var ts2 = new TransactionScope(TransactionScopeOptions.Suppress))
{
  using (var ts3 = new TransactionScope())
  {
    DoStuff();
    ts3.Complete();
  }

  ts2.Complete(); // not required but recommended for consistency's sake
}
1个回答

15
为了更好地理解事务范围,您可以阅读这篇MSDN文章
我找不到一个好的解释来区分这两者,除了创建的嵌套范围数量不同。无论事务是否已经存在,这两种情况都应该导致相同数量的事务。我找不到一个好的参考资源,但我总是会选择RequiresNew而不是Suppress/Required组合。RequiresNew 基本上意味着:"不管是否已经存在事务,都给我一个新的事务"。 更新: 如果第一个链接仍然无法访问,您可以在wayback archive这里找到它。

已经完成了,这就是给我留下印象的原因。引用:“RequiresNew:包含的代码依赖于事务,但必须独立提交或回滚。 Suppress:包含的代码执行自己的补偿,因此不能成为事务的一部分。” 这意味着(对我来说)“提交”或“回滚”RequiresNew TransactionScope 不能被操纵或依赖于外部事务 - 两者都不会相互影响。这就是Suppress应该对其内部Required TransactionScope所做的事情。 - Jaxidian
老实说,我误读了你的第二个代码块,并认为你有两个嵌套的transactionscopes()(我错过了外部那个Suppress)。我会进行编辑。 - Eddy
2
只是澄清一下...如果我回滚了RequiresNew事务,那不会影响父TransactionScope,同样地,如果我回滚了父TransactionScope,那也不会影响RequiresNew事务?抱歉,我只是想确保我完全理解这些选项。如果我混淆了它们,可能会有很多潜在的严重副作用(死锁、非原子操作等)! - Jaxidian
2
博客文章的第一个链接已经失效。 - adamjford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接