2011-01-27 4 views
1

J'essaie de rétablir l'état des objets sur les exceptions. Mon code est comme ::transactions utilisant deuce 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); 
    } 
} 

I ajouté -javaagent:myDir/deuceAgent.jar comme VMArgument en cours d'exécution sur Eclipse.

Résultat escompté ::

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

Résultat réel ::

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

Aussi, s'il vous plaît me suggérer de meilleurs exemples sur deuce pour revenir/restaurer l'état d'objet sur rollback transaction ou lors exception est levée.

+0

Utilisez 4 tirets pour formater votre code source. –

Répondre

3

La sémantique Deuce est valide sur l'exception de l'utilisateur, de la même manière que pour le verrouillage global unique. Cela a été fait comme ceci puisque les exceptions dans Java sont un contrôle de flux légitime.

Si vous souhaitez annuler la transaction, vous pouvez lancer TransactionException ou AbrotTransactionException.

BTW, puisque vous utilisez dans le cadre de votre transaction une classe qui fait partie de rt.jar (et chargé dans le bootclasspath), vous devez utiliser off-line le rt.jar ou au moins cette classe comme l'ajouter à le bootclassloader.

Voir: http://www.deucestm.org/documentation/getting-started

+0

Bien que la décision de conception de Duece soit de considérer Commit on Exception, cela semble étrange du point de vue de l'utilisateur. L'atomicité des défaillances de STM est perdue car la plupart des gens utiliseraient Exception en cas de défaillance. –

+0

Pourriez-vous être plus bref sur votre réponse .. ie; Quoi d'autre je devrais faire pour courir sur Deuce – Rahul

+0

"il se sent bizarre du point de vue de l'utilisateur", pourquoi est-ce étrange? Deuce par conception voulait donner aux utilisateurs la même sémantique que le verrou global. Signification supposant au lieu de @Atomic que vous auriez utilisé un bloc synchronisé. Ensuite, dans ce cas, vous auriez un comportement atomique alors qu'une exception n'aurait pas annulé le code. –

Questions connexes