簡體   English   中英

如何使一系列非數據庫方法模仿事務。

[英]How to make a series of non database methods mimic transactions.

我需要執行幾個方法調用,需要“事務性”但我不確定如何在try / catch / finally之外實現它。

背景

  • 應用程序基於控制台。
  • 應用程序將具有多個線程
  • 查詢數據庫以獲取連接信息,連接到Web服務以進行登錄,生成會話ID並更新數據庫。
  • 操作調用注銷,該注銷需要清理數據庫,清除會話ID並注銷Web服務

我想弄清楚的是什么

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

理想情況下,解決方案將在故障時“回滾”,從而確保維持先前的狀態。

有沒有一個光滑的方法來實現這一點,或者我堅持使用一系列嵌套的try / catch / finally塊來實現這一目標?

如果要實現某些rollback方法,則必須存儲撤消數據,以便在發生故障時回滾所需的所有內容。

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

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

“整潔”可能意味着這樣的事情? http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html

但是我更喜歡像你提到的KISS結構......至少在實現復雜的語言/資源構造之前一直堅持工作......讓它工作......然后讓它更美觀/快速/解耦/ ...

對於這個問題的任何偶然的問題, 不要認為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);
    }
}

輸出:

  • 原名:Marge
  • 抓到了異常
  • 事情是:荷馬

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM