LINQ to SQL中的嵌套事务

3

我需要帮助实现一个复杂的业务逻辑,涉及到多个表格和执行许多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)都被回滚?请注意,我也希望能够忽略单个Operation(i)的失败。

使用嵌套的TransactionScope对象可以实现这一点吗?如果不行,你会怎样解决这个问题?

1个回答

2
如果我理解您的问题正确的话,您想对数据库进行一系列操作,并捕获足够的信息以确定每个操作是成功还是失败(您简化的代码中的字典)。接着,如果最终操作失败,您必须回滚先前所有成功的操作。
看起来这正是简单事务的用例。只要最终操作失败会回滚整个事务(在此假设FinalOperation没有出于其他原因使用该信息),就无需跟踪子/早期操作的成功或失败。
在进入描述的块之前,只需启动一个事务,然后在了解FinalOperation的状态之后提交或回滚整个事务即可。从您当前的描述中,我认为没有必要嵌套子操作。
也许我漏掉了什么?(请注意,如果您想保留早期/子操作,那将完全是另一回事...但最终操作失败会将整个操作包回滚,使简单事务可用。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接