2011-01-27 5 views
1

例外のオブジェクト状態を元に戻そうとしています。私のコードは、Eclipse上で動作している間、私はVMArgumentとして-javaagent:myDir/deuceAgent.jarを追加しましたように::デュースstmを使用してトランザクション

public class DeuceTXTest 
{ 
@Atomic 
public void myTransactionMethod(HashMap<String, String> myHashMap) 
     { 
    myHashMap.put("s2", "two"); 
    if(8>5) 
        throw new NullPointerException(); 
} 

    public static void main(String[] args){ 
    HashMap<String, String> hashMap = new HashMap<String, String>(); 
    hashMap.put("s1", "one"); 
    System.out.println("Prior TX :: "+hashMap); 
    DeuceTXTest txTest = new DeuceTXTest(); 
    try { 
    txTest.myTransactionMethod(hashMap); 
    } catch (Exception e) { 
    System.out.println(e); 
    } 
    System.out.println("Post TX :: "+hashMap); 
    } 
} 

です。期待

結果::

Prior TX :: {s1=one} 
       java.lang.RuntimeException 
       Post TX :: {s1=one} 

の実績::

Prior TX :: {s1=one} 
     java.lang.RuntimeException 
     Post TX :: {s2=two, s1=one}. 

また、トランザクションのロールバックまたはときに例外がスローされた上でのオブジェクトの状態を復元/元に戻す私のデュースのより良い例を提案してください。

+0

ソースコードの書式設定に4つのインデントを使用します。 –

答えて

3

Deuce semanticは、ユーザーのコミットです。例外は、単一グローバルロックと同じです。 これは、JavaのExceptionが正当なフロー制御であるため、このように行われました。

トランザクションをロールバックする場合は、TransactionExceptionまたはAbrotTransactionExceptionをスローすることができます。

あなたはトランザクションの一部としてrt.jarの一部である(bootclasspathにロードされている)クラスを使用しているので、rt.jarまたは少なくともこのクラスをオフラインにする必要がありますブートクラスローダー

参照:http://www.deucestm.org/documentation/getting-started

+0

コミット・オン・エクセプションを考慮する意思決定をしている間は、ユーザーの視点からは奇妙に感じます。ほとんどの人が失敗条件でExceptionを使用するため、STMの障害原子性は失われます。 –

+0

あなたはあなたの答えをより簡潔にすることができますか? – Rahul

+0

デュースを走らせるために何をすべきか "それはユーザーの視点からは奇妙だ"と、なぜ奇妙なのでしょうか? デュースは、ユーザーにグローバルロックと同じセマンティックを与えたいと考えました。 意味は、@Atomicの代わりにsynchronizedブロックを使用したとします。この場合、例外にはコードがロールバックされませんが、アトミックな動作が発生します。 –

関連する問題