.net-TransactionScope和多线程

我想知道在处理多线程时如何正确使用TransactionScope类?

我们在主线程中创建一个新的作用域,然后生成几个工作线程,并希望它们参与主作用域,例如,如果该作用域从未完成,则在每个工作线程上调用回滚。

我在内部使用ThreadStaticAttribute读取了有关TransactionScope的内容,这使上述操作变得不可能/非常困难-有人可以验证这两种方法吗? 如果我们以同步的方式用完代码,那么回滚将起作用,即内部事务能够参与主事务,但是如果我们切换到线程执行则不能。

谢谢

TheCodeJunkie asked 2020-08-12T07:09:27Z
2个解决方案
29 votes

请参阅MSDN:

您还应该使用TransactionScope和 的DependentTransaction类 需要使用以下应用程序 跨多个相同的交易 函数调用或多线程 电话。

因此,也许要研究DependentTransaction-特别是这里有一个工作线程示例。

Marc Gravell answered 2020-08-12T07:09:43Z
18 votes

正确的是:TransactionScope类使用Transaction.Current属性将其值存储在字段中,该属性已用ThreadStatic属性标记。

TransactionScope属性可确保该字段值具有线程亲和力,即它在每个线程中都有唯一的值。 建议在线程中共享日期的方法。 也称为线程本地存储(TLS)。

TransactionScope类仅在当前线程中定义事务上下文。 但是,这并不意味着您的代码必须完成该线程中的所有工作。 我可以想象使用多个线程的复杂计算算法。

Michael Damatov answered 2020-08-12T07:10:13Z
translate from https://stackoverflow.com:/questions/673530/transactionscope-and-multi-threading