java - 使用 deuce stm 的交易

标签 java transactions atomic

我正在尝试恢复异常时的对象状态。我的代码是这样的::

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 或至少将此类添加到引导类加载器。

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

关于java - 使用 deuce stm 的交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4815911/

相关文章:

java - 使用 Web 服务时类似事务的逻辑

php - 如何使用 codeigniter 中的事务根据数据更改进行提交和回滚?

set - 在 Redis 中使用 WATCH 实现 ZMOVE

c# - Interlocked.Read/Exchange for longs on 64-bit architectures

java - 从两个下拉列表中的任一下拉列表中获取值

java - wsimport 命令失败并出现错误

java - 使用 Java 8 Streams,如何在 HashMap 中找到给定元素的最大值

.net - 系统.Data.EntityException : The underlying provider failed on Commit

mysql - 使用具有良好原子性的 MySQL 唯一索引而不会引发错误

java - 只是获取连接到系统的 USB 设备的名称?