2013-05-01 58 views
3

我有幾個需要執行的方法調用需要「事務性」,但我不確定如何從try/catch/finally中實現這一點。如何使一系列非數據庫方法模擬事務。

背景

  • 申請基於控制檯。
  • 應用程序將有多個線程
  • 查詢數據庫的連接信息,連接到web服務進行登錄,生成會話ID和更新數據庫。
  • 的操作調用註銷,需要清理數據庫,清除會話ID和登錄web服務的出

我試圖找出

我想確保在請求註銷時,我要確保整個過程都是成功的,或者根本不是。例如,我不希望清理數據庫,清除會話標識並註銷操作失敗(因此登錄仍然有效)。

理想情況下,解決方案會在故障時「回滾」,從而確保保持之前的狀態。

是否有一種很好的方法來完成這個任務,或者我堅持使用一系列嵌套的try/catch/finally塊來做到這一點?

回答

1

如果您想實施一些rollback方法,則必須存儲撤消數據,以查找在發生故障時需要回滾的所有事情。

  • 對於DB,您已經有一個回滾方法。
  • 對於您正在修改/刪除操作中可能需要回滾的每個文件,您必須保留備份副本,以允許您恢復到之前的狀態。
  • 任何可能必須回滾的內存中變量都應具有備份副本。

這將允許您在您的代碼中的任何一點發生錯誤時回滾到以前的狀態。

+1

這就是我所想的,基本上是try/catch/finally。數據庫中的事務回滾僅適用於數據庫本身,我仍然需要通過臨時變量管理所有其他狀態。 – 2013-05-01 20:47:25

+0

即使使用數據庫事務,您也需要一個try/catch/finally塊,以便在catch中回滾並最終關閉連接。如果您在所有失敗的地方拋出異常,並將其捕獲到最高級別,那麼您可以減少此類塊的數量,並在那裏調用回滾方法。你最後的方法可以清除所有的臨時變量/文件。 – Eran 2013-05-01 20:51:54

+0

是的。我想等待任何其他信息,我將不得不走這條路。啊,沒什麼冒險的,什麼都沒有增加。 – 2013-05-01 20:56:28

0

「整齊」可能意味着這樣的事情?但是我更喜歡像你提到的KISS構造......至少直到在用複雜的語言/資源構造實現之前堅實工作......讓它工作......然後讓它更加漂亮/快速/ decoupled/...

0

對於這個問題的任何隨便瞥見者,不要假設try/catch塊是基本原子的。他們

證明代碼:

public class TransactionTest { 

    private class Thing { 
     public int number = 1; 
     public String thingName = "Marge"; 

    } 

    public static void main(String args[]) { 
     new TransactionTest(); 
    } 

    public TransactionTest() { 
     transactionExperiment(); 
    } 

    private void transactionExperiment() { 

     Thing t = new Thing(); 
     try { 
      System.out.println("Original name: " + t.thingName); 
      t.thingName = "Homer"; 
      throw new IllegalArgumentException("Throw exception deliberately"); 
     } 
     catch(IllegalArgumentException e) { 
      System.out.println("Caught exception"); 
     } 

     System.out.println("Thing is: " + t.thingName); 
    } 
} 

輸出:

  • 原名:瑪吉
  • 捕捉到異常
  • 事情是:荷馬