gpt4 book ai didi

java - JTA - 交易是如何注册的?

转载 作者:行者123 更新时间:2023-11-30 09:21:32 28 4
gpt4 key购买 nike

我使用以下我在网上找到的代码 ( 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,对吧?他们一定已经成功了,这样我们才能在底部进行回滚调用。好吧,如果他们成功了,也就是 promise 了,我们到底怎么才能让他们突然退缩呢?
  3. 最重要的问题:当我们说 txn.begin() 时会发生什么?我从 JTA API 了解到,它应该通过 TransactionManager 实例向调用线程注册此事务。 TM 是如何链接到 UserTransaction 的?最后,txn 如何知道我们修改了 DB 两次并能够与 DB 对话以将其回滚?我们还没有向它注册任何 ResourceManager,所以它不应该知道任何资源正在发挥作用......

我在这里有点迷路,所以任何信息将不胜感激......问题 3 最困扰我。

最佳答案

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

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

  3. 据推测,UserTransaction 有一个对其事务管理器的引用。当你从 Java EE 环境中的数据源获取连接时,数据源链接到 Java EE 容器的事务管理器,回滚 JTA 事务将使用 XA 协议(protocol)回滚期间对所有数据源所做的所有操作交易。那是容器的事,不是你的事。

关于java - JTA - 交易是如何注册的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16938978/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com