транзакции с использованием двойки stm - PullRequest
1 голос
/ 27 января 2011

Я пытаюсь восстановить состояние объекта в исключениях. Мой код похож на: *

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

Я добавил -javaagent:myDir/deuceAgent.jar в качестве VMArgument во время работы на затмении.

Ожидаемый результат ::

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

Фактический результат ::

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

Также, пожалуйста, предложите мне лучшие примеры для двойного восстановления / восстановления состояния объекта при откате транзакции или при возникновении исключения.

1 Ответ

3 голосов
/ 28 января 2011

Двойная семантика - это фиксация на пользовательском Exception, так же, как и с одиночной глобальной блокировкой.Это было сделано так, поскольку исключения в Java являются законным управлением потоком.

Если вы хотите откатить транзакцию, вы можете выбросить TransactionException или AbrotTransactionException.

Кстати, так как вы используете как частьвашей транзакции - класса, который является частью rt.jar (и загружен в путь загрузки класса), вы должны отключить инструмент rt.jar или, по крайней мере, от этого класса, добавив его в загрузчик загрузчика.

См .: http://www.deucestm.org/documentation/getting-started

...