【问题标题】:TransactionScope and multi-threadingTransactionScope 和多线程
【发布时间】:2009-03-23 14:15:28
【问题描述】:

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

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

我在内部使用 ThreadStaticAttribute 阅读了一些关于 TransactionScope 的内容,这使得上述不可能/非常困难 - 有人可以验证任何一种方式吗?如果我们以同步方式运行我们的代码,那么回滚就会起作用,即内部事务能够参与主事务,但如果我们切换到线程执行,则不会。

【问题讨论】:

  • 好问题;这是我简单地认为“不要那样做”的情况,但经过调查,有通过 DependentTransaction 提供的支持。我学到了一些东西,谢谢。
  • 考虑到这里描述的内容现在被认为是一个错误,现在这可能是真正过时的信息,并且 TransactionScope 有一个新选项允许它在异步等待中流动,这必须支持多线程。 particular.net/blog/…

标签: .net multithreading transactions transactionscope


【解决方案1】:

MSDN:

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

所以也许看看DependentTransaction - 特别是,有一个工作线程示例,here

【讨论】:

【解决方案2】:

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

ThreadStatic 属性确保字段值获得线程亲和性,即它在每个线程中具有唯一值。这是在线程共享数据的推荐方法。它也称为Thread Local Storage (TLS)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多