Java JTA-如何注册交易?

Java JTA-如何注册交易?,java,transactions,jta,Java,Transactions,Jta,我使用在线找到的以下代码()作为JTA事务处理的示例: // Get a UserTransaction UserTransaction txn = new InitialContext().lookup("java:comp/UserTransaction"); try { System.out.println("Starting top-level transaction."); txn.begin(); stmtx = conn.create

我使用在线找到的以下代码()作为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
    然后rollback的全部意义是能够(似乎)回滚两个SQL语句,对吗
  • 每个更新查询都是事务本身,对吗?他们一定成功了,这样我们就可以在底部进行回滚。好吧,如果他们成功了,也就是承诺了,我们怎么能突然让他们退却呢
  • 最重要的问题是:当我们说
    txn.begin()
    时会发生什么?我从JTAAPI了解到,它应该通过
    TransactionManager
    实例向调用线程注册此事务。TM是如何链接到
    用户事务的?最后,txn是如何意识到我们对DB进行了两次修改并且能够与DB对话以回滚它的?我们没有向it部门注册任何
    ResourceManager
    s,因此it部门不应该知道有任何资源在使用
  • 我在这里有点迷路,所以任何信息都将不胜感激。。。问题3最困扰我

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

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

  • 据推测,UserTransaction有一个对其事务管理器的引用。当您从Java EE环境中的数据源获得连接时,数据源链接到Java EE容器的事务管理器,回滚JTA事务将使用XA协议回滚事务期间对所有数据源执行的所有操作。那是集装箱的事,不是你的


  • 关于交易,有很多东西需要学习,但也许我可以给你一个领先的开始:

  • 对。但您通常只希望在出现问题时回滚—由于技术问题(语法错误、找不到表、段溢出等)或应用程序逻辑问题(例如,客户没有足够的资金用于所有订单行项目),事务的某些步骤无法完成
  • 如果禁用了自动提交模式,则在实际提交之前不会提交插入。它们临时应用于数据库,使用具有复杂的多版本并发控制(MVCC)的预写日志(PostgreSQL、InnoDB Engine、Oracle)确定每个事务客户端可以看到的数据库状态。一个非常有趣的话题:-)
  • UserTransaction已在当前线程中注册。资源(即数据库或消息服务)通过UserTransaction登记自己。这通常仅在使用分布式事务(XA事务,2PC)时才有必要

  • 我建议大家好好阅读一下SQL编程(例如),并查看。

    感谢您的回复@JB Nizet。我需要在第二点上持不同意见。如果我根本没有使用JTA,我只会使用JDBC,执行两个查询(默认的autoCommit为true),然后检查数据库,我会发现它要更新。这只是一个简单的JDBC查询,它更新数据库,并且在下面执行单个事务(两个单独的事务,在本例中,我们执行了两个SQL语句),显然,当使用JTA事务时,自动提交是错误的。所以不,它们不是交易。如果它们是事务,则每次更新都会在执行后立即提交,您将无法再回滚它们,从而破坏了使用事务的全部目的。谢谢您的回答。我仍然看不到UserTransaction如何了解底层数据库连接。连接(DB资源)如何在UserTransaction中登记自身?UserTransaction甚至没有通过API公开这样的机制。你想知道这些东西是件好事,我喜欢:)!困扰您的“魔力”如:--3.2.1启动事务TransactionManager.begin方法启动全局事务并将事务上下文与调用线程关联。--(第3.3.1节资源登记)“应用程序服务器执行的资源登记有两个目的:它向事务管理器通知正在参与全局的Resource Manager实例……对不起,我还需要了解注释的格式选项——基本上看一下JTA规范和应用程序服务器源代码。玩得高兴再次感谢您的评论。我的想法是,使用TransactionManager可以获得一个事务对象,我们可以通过调用EnstractResource(XAResource)方法来登记该资源。但是,UserTransactions不受transactionManager的控制,即它不会从调用transactionManager开始。。。这就是为什么我有点困惑。