2010-09-14 29 views
0

我有一個我經常碰到的場景。與標準的ADO交易相比,使用 很簡單,但與NH(我知道)沒有太大關係。在活動事務中執行Flush()

我有2個表來更新。第一個包含配置文件信息 (配置文件),另一個(工作)包含需要進行的記錄更改 以及這些更改的狀態。對於 配置文件表的每次更新,工作 表中的狀態都會更新。

  • 如果更新配置文件表失敗,我需要更新工作表上的 狀態。
  • 如果更新配置文件表成功,並且更新到 工作表失敗,則需要回滾該事務。

問題是,我不知道更新配置文件表 失敗,直到我提交事務。我嘗試在 配置文件上執行刷新以捕獲異常,以便我可以將狀態寫入工作 表中,但隨後由於 配置文件更新導致的異常導致我的Commit失敗。

我該如何處理?在典型的ADO交易中,我的第一個電話 將拋出,但我可以捕獲並仍在更新 交易中的其他表。

下面是我的代碼的樣子 - 很標準。這不是我的 實際的代碼,所以請專注於問題,並不是說我不 處置我的交易或關閉我的會議):

try 
{ 
    ITransaction trans = _session.BeginTransaction(); 

    var work = _repo.GetWork(); 
    var profile = _repo.GetProfile(work.ProfileId); 

    try 
    { 
     profile.UpdateWithNewValues(work); 
     _session.SaveOrUpdate(profile); 
     _session.Flush(); 
     work.Status = "Success"; 

    }catch{ 
     work.Status = "Failure"; 
    } 

    _session.SaveOrUpdate(work); 
    trans.Commit(); 

}catch{ 

    trans.Rollback(); 

} 

我認識到,同花順()是行不通的,但我不知道 如何做到這一點。

回答

0

需要您的要求一些澄清。

1)>>如果更新配置表成功,並更新到工作表失敗,我需要回滾事務

我本來以爲工作就像是一個審計跟蹤更新,並應如果配置文件更新正常,則不會失敗如果是這種情況,那麼你不應該回滾你的交易。然而,說了這些,你的代碼已經符合這個要求。

2)>>如果更新配置文件表失敗,我需要更新工作表上的狀態。

如果更新失敗,那麼您將回滾事務。除非您有兩個單獨的交易(一個用於Profile和Work(作爲當前),另一個用於Work),否則將無法更新工作表。你能理解這個嗎?

+0

是的,我意識到,但希望得到一個更簡單的答案。這實際上是一個批處理過程,所以我省略了相關的細節。感謝您的建議。 – 2010-09-15 13:51:47

0

我沒有看到在沖洗前有trans.Commit的問題。下面是一個例子(稍作修改過像你的):

Profile profile; 
Work work; 
ITransaction tx; 

try 
{ 
    session.SaveOrUpdate(profile); 

    work.Status = "Success";  
    session.SaveOrUpdate(work); 

    tx.Commit(); 
} 
catch (Exception) // wroh oh... 
{ 
    try 
    { 
     work.Status = "Failure"; 
     session.SaveOrUpdate(work); 

     tx.Commit(); 
    } 
    catch (Exception) 
    { 
     if (!tx.WasRolledBack) 
     { 
      tx.Rollback(); 
      session.Clear(); 
     } 

     throw; 
    } 
} 
finally 
{ 
    if (session.IsOpen) 
    { 
     // Whatever happened, Flush/Persist at the end. 
     session.Flush(); 
    } 
} 
+0

感謝您的想法,但這不會因爲幾個原因。首先,如果第二個交易失敗,我將無法回滾第一筆交易。其次,一旦出現異常,該事務會保留它以進行任何進一步的commit()調用。 – 2010-09-14 20:40:14