JTA - 交易如何注册?

时间:2013-06-05 11:40:53

标签: java transactions jta

我使用我在网上找到的以下代码(Here)作为JTA事务处理的示例:

// Get a UserTransaction
        UserTransaction txn = new InitialContext().lookup("java:comp/UserTransaction");
try {
     System.out.println("Starting top-level transaction.");

     txn.begin();
     stmtx = conn.createStatement(); // will be a tx-statement 

     stmtx.executeUpdate("INSERT INTO test_table (a, b) VALUES (1,2)");
     stmtx.executeUpdate("INSERT INTO test_table2 (a, b) VALUES (3,4)");

     System.out.print("\nNow attempting to rollback changes.");

     txn.rollback();
}

总的来说,我有几个问题是关于从上面的例子中得出的JTA:

  1. 我假设说txn.begin的全部意义,然后回滚就能够(显然)回滚两个SQL语句正确吗?
  2. 每个更新查询都是TRANSACTIONS本身,对吧?它们必须成功,以便我们可以在底部进行回滚调用。好吧,如果他们成功了,那么我们怎么能突然回来呢?
  3. 最重要的问题:当我们说txn.begin()时会发生什么?我从JTA API了解到它应该通过TransactionManager实例向调用线程注册此事务。 TM如何与UserTransaction相关联?最后,txn如何知道我们修改了DB两次并且能够与DB对话以回滚它?我们没有注册任何ResourceManager,所以它不应该知道任何资源在起作用......
  4. 我在这里有点迷失,所以任何信息都会受到赞赏......问题3最让我困扰。

2 个答案:

答案 0 :(得分:1)

  1. 是的,或只是一个事件。它也是最后提交事务的能力,因此其他并发事务只在事务提交后才看到新状态,而不是事务开始和结束之间的所有临时状态(即I)在ACID)

  2. 没有。更新是更新。它是作为您之前开始的交易的一部分执行的。如果其中一个没有成功,您将有一个例外,并且仍然可以选择提交事务(即提交所有先前的更新),或者回滚事务(即取消所有先前的更新)。

  3. UserTransaction可能会引用其事务管理器。当您从Java EE环境中的DataSource获得连接时,DataSource将链接到Java EE容器的事务管理器,并且回滚JTA事务将使用XA协议回滚在所有数据源上执行的所有操作。交易。这是集装箱的业务,而不是你的业务。

答案 1 :(得分:1)

有很多关于交易的知识,但也许我可以给你一个良好的开端:

  1. 是。但是你通常只想在出现问题时回滚 - 由于技术问题(语法错误,找不到表,段超限,......)或应用程序逻辑问题(客户),事务的某些步骤无法完成没有足够的资金用于所有订单项目。例如)。
  2. 如果禁用了自动提交模式,则在实际提交之前不会提交插入。它们使用具有复杂的多版本并发控制(MVCC)的Write-Ahead-Log(PostgreSQL,InnoDB-Engine,Oracle)临时应用于数据库,MVCC确定每个事务客户端可以看到的数据库的状态。一个非常有趣的话题: - )。
  3. UserTransaction已在您当前的Thread中注册。资源(即数据库或消息传递服务)使用UserTransaction登记自己。这通常仅在您使用分布式事务(XA事务,2PC)时才需要。
  4. 我建议您仔细阅读SQL编程(例如Head First SQL)并查看Java EE 6 tutorial