@Resource UserTransaction和EntityManager.getTransaction()之间有什么区别

TCM*_*TCM 30 java jpa jta java-ee

谁能解释一下有什么区别:

@Resource
UserTransaction objUserTransaction;
Run Code Online (Sandbox Code Playgroud)

EntityManager.getTransaction();
Run Code Online (Sandbox Code Playgroud)

什么是容器管理交易?如果我想在事务中的表中插入三行,我应该如何在会话外观中执行此操作.

ewe*_*nli 27

EJB是事务组件.事务可以由应用程序服务器本身(CMT - 容器管理的事务)管理,也可以由EJB中自己手动管理(BMT - bean管理的事务).

EJB通过JTA规范支持分布式事务.分布式事务来控制使用UserTransaction,其具有的方法begin,commit,rollback.

使用CMT,应用程序服务器为您启动,提交和回滚事务(根据事务注释),并且不允许您进行干预.这意味着UserTransaction在这种情况下您不能访问.但是,使用BMT,您可以手动执行此操作,并使用自己控制事务UserTransaction.

我们现在开始吧EntityManager.JPA实现可以在应用程序服务器中使用,也可以单独使用.如果在独立使用,则需要使用EntityManage.getTransaction自己划分JDBC事务.如果在应用程序服务器中使用,EntityManager则为您透明地与JTA分布式事务管理器协作.

大多数情况下,您@Required在EJB上使用带有注释的CMT .这意味着您既不需要UserTransaction也不需要访问EntityManager.getTransaction.该应用程序.服务器启动并提交事务,但如果引发异常,也会小心回滚.这就是我建议您的外观.

(还有更多的细微之处,如PersistenceContextType或与分布式事务的实体管理器的手动入伍EntityManager.joinTransaction,但如果你使用的技术在不同的方式为默认,这只是).

  • 在应用服务器内部运行时,您确定`EntityManager#getTransaction()`是否与JTA分布式事务协作?我不认为这样做,我的理解是它返回一个资源本地事务,可以用来在当前JTA事务的*之外保存数据*. (3认同)
  • 实际上,`getTransaction`在JTA EntityManager上调用时抛出异常).实际上,我想到的示例(来自"Pro JPA 2")是在会话Bean中获取应用程序管理的资源本地EM(例如,用于审计日志记录)以及可以开始/提交的资源本地事务您想要在JTA交易之外的时间.但我意识到我误解了你的答案,这与你写的不同.谢谢! (2认同)

Mar*_*rco 9

UserTransactionJTA交易实体.只有在应用程序服务器中有可用的JTA模块时才能使用它:例如,如果在Tomcat上部署应用程序(默认情况下不支持JTA),依赖于此的代码将失败.这是EJB和MDB中使用的默认事务类型.

EntityManager.getTransaction()检索本地事务实体.这有时也称为资源本地事务.

资源本地事务与JTA事务非常不同:除其他外,资源本地事务特定于资源,而JTA事务往往特定于特定线程.

有关资源本地和JTA事务之间差异的更多信息,请参阅此stackoverflow答案:JTA和本地事务之间有什么区别?