2008-10-21 87 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的狀態後提交或回滾整個事物。根據我目前的描述可以看出,沒有必要嵌套子操作。

也許我缺少一些東西? (請注意,如果您想保留早期/子級操作,那將完全不同......但最終操作將整個操作包回滾失敗使得簡單事務可用)。