5

「トランザクション」である必要がある実行する必要があるいくつかのメソッド呼び出しがありますが、try/catch/finally 以外にこれを実装する方法がわかりません。

バックグラウンド

  • アプリケーションはコンソール ベースです。
  • アプリケーションには複数のスレッドがあります
  • データベースに接続情報を照会し、Web サービスに接続してログインし、セッション ID を生成してデータベースを更新します。
  • 操作によってログアウトが呼び出され、データベースをクリーンアップし、セッション ID をクリアして、Web サービスからログアウトする必要があります。

私が理解しようとしていること

ログアウトが要求されたときに、プロセス全体がすべて成功するか、まったく成功しないかを確認したいと考えています。たとえば、データベースをクリーンアップしたくない場合、セッション ID がクリーンアップされ、ログアウト操作が失敗します (したがって、ログインは引き続き有効です)。

理想的には、ソリューションは障害時に「ロールバック」し、それによって以前の状態が維持されるようにします。

これを達成するための巧妙な方法はありますか、またはこれを行うために一連の入れ子になった try/catch/finally ブロックで立ち往生していますか?

4

3 に答える 3

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);
    }
}

出力:

  • 元の名前:マージ
  • キャッチされた例外
  • 事は:ホーマー
于 2014-03-13T16:13:26.073 に答える
0

「きちんと」はこんな意味でしょうか?( http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html )

しかし、私はあなたが言及したようなKISSコンストラクトをはるかに好みます...少なくとも、複雑な言語/リソースコンストラクトを実装する前にしっかりと動作するまで...それを機能させます...次に、よりきれい/高速/分離/...

于 2013-05-01T21:30:14.420 に答える