2008-10-21 81 views
3

我需要帮助实现相当复杂的业务逻辑,这些业务逻辑在很多表上运行,并执行不少SQL命令。不过,我想确保数据不会处于无效状态,而现在我看不到需要嵌套事务的解决方案。我写了一个简单的伪代码说明了类似于什么我要完成一个场景:LINQ to 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失败,所有操作动作(I),从而成功回滚?请注意,我也希望能够忽略单个操作(i)的故障。

是否有可能通过使用嵌套的TransactionScope对象来实现这一点,如果不是 - 您将如何处理这样的问题?

回答

2

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

从那里,你有一个最终操作,如果它自己失败,必须从早期回滚所有成功的操作。

这看起来正是这种简单事务的情况。只要最终业务的失败将整个交易推回(此处假设FinalOperation因其他原因而未使用该信息),就不需要追踪子/早期业务的成败。

在您输入所描述的块之前,只需启动一个事务,并在知道FinalOperation的状态后提交或回滚整个事物。根据我目前的描述可以看出,没有必要嵌套子操作。

也许我缺少一些东西? (请注意,如果您想保留早期/子级操作,那将完全不同......但最终操作将整个操作包回滚失败使得简单事务可用)。