我正在使用我在网上找到的以下代码(此处)作为 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 语句是否正确? - 每个更新查询都是 TRANSACTIONS 本身,对吧?他们一定已经成功了,这样我们才能在底部回滚调用。好吧,如果他们成功了,即承诺,我们怎么能突然把他们回滚呢?
- 最重要的问题:当我们说 时会发生什么
txn.begin()
?我从 JTA API 了解到,它应该通过TransactionManager
实例向调用线程注册此事务。TM 是如何与 TM 联系起来的UserTransaction
?最后,txn 是如何知道我们修改了 DB 两次并且能够与 DB 对话以将其回滚的事实?我们还没有向它注册 ANYResourceManager
,所以它不应该知道任何资源正在发挥作用......
我在这里有点迷路,所以任何信息都将不胜感激......问题3最困扰我。