TransactionScope和多线程

49

我在想如果你需要处理多线程时,如何正确使用TransactionScope类呢?

我们在主线程中创建一个新的作用域,然后我们生成一些工作者线程,希望这些线程能够参与到主作用域中,例如,如果作用域没有完成,则每个工作者都会调用回滚。

我读到了一些关于TransactionScope在内部使用ThreadStaticAttribute的内容,这使得上述操作变得不可能或者非常困难 - 有人可以验证一下吗?如果我们以同步方式运行代码,则回滚是有效的,即内部事务可以参与主事务,但如果我们切换到线程执行,则无效。


1
好问题;这是一个我曾经简单地忽略为“不要那样做”的场景,但经过调查,通过DependentTransaction有支持。我学到了一些东西,谢谢。 - Marc Gravell
这可能是过时的信息,因为现在所描述的被认为是一个 bug,而 TransactionScope 有一个新选项,允许它在异步等待中流动,这将支持多线程。https://particular.net/blog/transactionscope-and-async-await-be-one-with-the-flow - Triynko
2个回答

34

请参阅MSDN

对于需要在多个函数调用或多个线程调用之间使用相同事务的应用程序,还应使用TransactionScope和DependentTransaction类。

因此,可以研究一下DependentTransaction - 特别是这里提供了一个工作线程示例:这里


我也发现这两篇博客文章很有用:http://www.pluralsight.com/community/blogs/jimjohn/archive/2005/04/14/7332.aspx 和 http://www.pluralsight.com/community/blogs/jimjohn/archive/2005/05/01/7923.aspx - Roman Starkov
2
很遗憾,该博客现在无法找到。 - Kiquenet
@Kiquenet 在像这样的情况两个中,几乎总是有回溯机器的方法。 - Evgeniy Berezovsky
7
.NET 4.5.1引入了一种更优雅的解决方案,使用TransactionScopeAsyncFlowOption.Enabled。在这里可以了解更多信息https://dev59.com/X2Yr5IYBdhLWcg3wmLVk#17527759 - Leon van der Walt

19
这是正确的做法: TransactionScope 类使用存储在带有 ThreadStatic 属性标记的字段中的值的 Transaction.Current 属性。

ThreadStatic 属性确保字段值具有线程亲和性,即每个线程都有其唯一值。这是共享数据 线程内的推荐方法,也称为线程本地存储(TLS)。 TransactionScope 类只是在当前线程中定义事务上下文。然而,这并不意味着 你的 代码必须在该线程执行所有任务。我可以想象一个使用多个线程的复杂计算算法。

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