将 TransactionScope 传递给 Parallel.Invoke 创建的任务

发布于 2024-12-03 03:02:31 字数 1189 浏览 1 评论 0原文

我希望并行运行的 TxJobs 从此父事务创建范围。我该如何进行这项工作?

using (var tx = TransactionScope()) {
    Parallel.Invoke(TxJob1, TxJob2) ;
    tx.Complete();
}

我传入了 DependentClone

using (var tx = new TransactionScope()) {
    var dtx1 = Transaction.Current.DependentClone(
        DependentCloneOption.RollbackIfNotComplete) ;
    var dtx2 = Transaction.Current.DependentClone(
        DependentCloneOption.RollbackIfNotComplete) ;
    Parallel.Invoke(() => TxJob1(dtx1), () => TxJob2(dtx2)) ;
    tx.Complete();
}

TxJob1TxJob2 方法中,如果我只在从属克隆。但是,如果我从克隆创建范围,则会收到 TransactionAbortedException

void TxJob1(Transaction dt) {
    using (var tx = new TransactionScope(dt)) {
        Console.WriteLine(dtx.TransactionInformation.LocalIdentifier);
        tx.Complete();
    }
}

该异常是通过在主方法中调用 Complete 引发的,而不是在 TxJobs< /代码>。为什么会失败?

[编辑] 如果我在 TxJobs 中的 DependentTransaction 上显式调用 Complete,那么它就可以工作。如果我没有在 TxJobs 中的新 TransactionScope 上调用 Complete(触发回滚),则父事务将失败。看起来我必须在两个 Transaction 对象上调用 Complete。

I want the TxJobs, which are running in parallel, to create a scope from this parent transaction. How do I make this work?

using (var tx = TransactionScope()) {
    Parallel.Invoke(TxJob1, TxJob2) ;
    tx.Complete();
}

I passed in a DependentClone:

using (var tx = new TransactionScope()) {
    var dtx1 = Transaction.Current.DependentClone(
        DependentCloneOption.RollbackIfNotComplete) ;
    var dtx2 = Transaction.Current.DependentClone(
        DependentCloneOption.RollbackIfNotComplete) ;
    Parallel.Invoke(() => TxJob1(dtx1), () => TxJob2(dtx2)) ;
    tx.Complete();
}

In the TxJob1 and TxJob2 methods, it works if I just call Complete on the DependentClones. However, if I create a scope from the clone I get a TransactionAbortedException:

void TxJob1(Transaction dt) {
    using (var tx = new TransactionScope(dt)) {
        Console.WriteLine(dtx.TransactionInformation.LocalIdentifier);
        tx.Complete();
    }
}

The exception is raised by the call to Complete in the main method, not in TxJobs. Why does this fail?

[edit] If I explicitly call Complete on the DependentTransaction in TxJobs, then it works. If I don't call Complete on the new TransactionScope in TxJobs (triggering a rollback), then the parent transaction fails. It looks like I have to call Complete on both Transaction objects.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

假情假意假温柔 2024-12-10 03:02:31

看起来我必须在依赖克隆和 TransactionScope 上调用 Complete。 MS 在其示例代码中执行了相同的操作。

It looks like I have to call Complete on both the dependent clone and the TransactionScope. MS does the same in their sample code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文