gpt4 book ai didi

.net - 嵌套/子事务范围回滚

转载 作者:行者123 更新时间:2023-12-03 10:11:54 26 4
gpt4 key购买 nike

我正在尝试像在 SQL Server 中嵌套事务一样嵌套 TransactionScopes (.net 4.0),但是看起来它们的操作方式不同。我希望我的子事务在失败时能够回滚,但允许父事务决定是否提交/回滚整个操作。问题是当第一次完成时,事务被回滚。我意识到完成与提交不同。

我正在尝试做的一个大大简化的例子:

static void Main(string[] args)
{
using(var scope = new TransactionScope()) // Trn A
{
// Insert Data A

DoWork(true);
DoWork(false);

// Rollback or Commit
}
}

// This class is a few layers down
static void DoWork(bool fail)
{
using(var scope = new TransactionScope()) // Trn B
{
// Update Data A

if(!fail)
{
scope.Complete();
}
}
}

我不能使用 Suppress 或 RequiresNew 选项,因为 Trn B 依赖于 Trn A 插入的数据。 如果我使用这些选项,Trn B 会被 Trn A 阻止。

任何想法如何让它工作,或者甚至可以使用 System.Transactions 命名空间?

谢谢

最佳答案

你可能不会喜欢这个答案,但是......

Voting inside a nested scope

Although a nested scope can join the ambient transaction of the root scope, calling Complete in the nested scope has no affect on the root scope. Only if all the scopes from the root scope down to the last nested scope vote to commit the transaction, will the transaction be committed.


(来自 Implementing an Implicit Transaction using Transaction Scope) TransactionScope不幸的是,class 没有提供任何机制(据我所知)来隔离工作单元。要么全有要么全无。您可以使用 TransactionScopeOption.Suppress 防止在特定工作单元上发生任何事务。 ,但这可能不是您想要的,因为您将失去该范围内任何内容的原子性。
当您使用 TransactionScope 时,只有一个“环境”事务。 .曾经 TransactionScope在没有 Complete 的情况下处理或收集正在执行,整个环境事务被回滚;就这样,游戏结束。
事实上,SQL Server 根本不支持真正的嵌套事务,尽管通过适当使用 SAVE TRAN 有可能(尽管有些不直观)达到相同的最终结果。声明。如果您需要此特定行为,则将此逻辑重新实现为存储过程(或其中几个)可能是您的最佳选择。

关于.net - 嵌套/子事务范围回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2741988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com