gpt4 book ai didi

sql - LINQ to SQL 中的嵌套事务

转载 作者:行者123 更新时间:2023-12-02 02:38:31 26 4
gpt4 key购买 nike

我需要帮助来实现相当复杂的业务逻辑,这些业务逻辑在许多表上运行并执行相当多的 SQL 命令。但是我想确保数据不会处于不一致的状态,到目前为止我还没有看到不需要嵌套事务的解决方案。我写了一个简单的伪代码来说明类似于我想要完成的场景:

Dictionary<int, bool> opSucceeded = new Dictionary<int, bool> ();

for (int i = 0; i < 10; i++)
{
try
{
// this operation must be atomic
Operation(dbContext, i);

// commit (?)

opSucceeded[i] = true;
}
catch
{
// ignore
}
}

try
{
// this operation must know which Operation(i) has succeeded;
// it also must be atomic
FinalOperation(dbContext, opSucceeded);

// commit all
}
catch
{
// rollback FinalOperation and operation(i) where opSucceeded[i] == true
}

对我来说最大的问题是:如何确保如果 FinalOperation 失败,所有成功的操作 Operation(i) 都被回滚?请注意,我还希望能够忽略单个操作 (i) 的失败。

是否可以通过使用嵌套的 TransactionScope 对象来实现这一点?如果不能,您将如何解决此类问题?

最佳答案

如果我在回答您的问题,您希望对数据库进行一系列操作,并且您捕获足够的信息来确定每个操作是成功还是失败(简化代码中的字典)。

从那里开始,您有一个最终操作,如果它自身失败,则必须回滚之前所有成功的操作。

看起来这正是简单交易所适用的案例类型。只要最终操作的失败将整个事务回滚(此处假设 FinalOperation 出于其他原因未使用该信息),就无需跟踪子操作/早期操作的成功或失败。

只需在进入描述的 block 之前启动事务,并在知道 FinalOperation 的状态后提交或回滚整个事务。据我目前的描述,没有必要嵌套子操作。

也许我遗漏了什么? (请注意,如果您想保留早期/子操作,那将是完全不同的事情......但是最终操作失败将整个操作包回滚使得简单事务可用)。

关于sql - LINQ to SQL 中的嵌套事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/222325/

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