我使用我在网上找到的以下代码(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:
txn.begin
的全部意义,然后回滚就能够(显然)回滚两个SQL语句正确吗?txn.begin()
时会发生什么?我从JTA API了解到它应该通过TransactionManager
实例向调用线程注册此事务。 TM如何与UserTransaction
相关联?最后,txn如何知道我们修改了DB两次并且能够与DB对话以回滚它?我们没有注册任何ResourceManager
,所以它不应该知道任何资源在起作用...... 我在这里有点迷失,所以任何信息都会受到赞赏......问题3最让我困扰。
答案 0 :(得分:1)
是的,或只是一个事件。它也是最后提交事务的能力,因此其他并发事务只在事务提交后才看到新状态,而不是事务开始和结束之间的所有临时状态(即I)在ACID)
没有。更新是更新。它是作为您之前开始的交易的一部分执行的。如果其中一个没有成功,您将有一个例外,并且仍然可以选择提交事务(即提交所有先前的更新),或者回滚事务(即取消所有先前的更新)。
UserTransaction可能会引用其事务管理器。当您从Java EE环境中的DataSource获得连接时,DataSource将链接到Java EE容器的事务管理器,并且回滚JTA事务将使用XA协议回滚在所有数据源上执行的所有操作。交易。这是集装箱的业务,而不是你的业务。
答案 1 :(得分:1)
有很多关于交易的知识,但也许我可以给你一个良好的开端:
我建议您仔细阅读SQL编程(例如Head First SQL)并查看Java EE 6 tutorial。