我正在尝试恢复异常时的对象状态。我的代码是这样的::
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);
}
}
我在 eclipse 上运行时添加了 -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}.
此外,请建议我更好的示例,以在事务回滚或抛出异常时恢复/恢复对象状态。
最佳答案
Deuce 语义是在用户异常时提交,与单个全局锁相同。 这是这样做的,因为 Java 中的异常是合法的流控制。
如果您想回滚事务,您可以抛出 TransactionException 或 AbrotTransactionException。
顺便说一句,由于您在事务中使用的类是 rt.jar 的一部分(并加载到 bootclasspath 中),因此您应该离线检测 rt.jar 或至少将此类添加到引导类加载器。
关于java - 使用 deuce stm 的交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4815911/