我需要帮助来实现相当复杂的业务逻辑,它在许多表上运行并执行相当多的 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 对象来实现这一点,如果没有 - 你将如何解决这样的问题?