@Resource UserTransaction 和 EntityManager.getTransaction() 之间的区别是什么?

2022-09-01 10:52:08

任何人都可以解释两者之间的区别:

@Resource
UserTransaction objUserTransaction;

EntityManager.getTransaction();

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


答案 1

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

EJB 通过 JTA 规范支持分布式事务。分布式事务使用 UserTransaction 进行控制,UserTransaction 具有方法 、 、 。begincommitrollback

使用 CMT,应用程序服务器会为您启动、提交和回滚事务(根据事务注释),并且您不被允许干扰。这意味着在这种情况下,您不得访问 。但是,使用BMT,您可以手动执行此操作,并使用.UserTransactionUserTransaction

现在让我们转到 .JPA 实现既可以在应用程序服务器中使用,也可以独立使用。如果在独立模式下使用,则需要使用 来自己划分 JDBC 事务。如果在应用程序服务器中使用,则与 JTA 分布式事务管理器透明地协作。EntityManagerEntityManage.getTransactionEntityManager

大多数情况下,您在 EJB 上使用带有注释的 CMT。这意味着您既不需要访问 也不需要访问 。应用程序服务器启动并提交事务,但也会在引发异常时注意回滚。这就是我对你的门面推荐的。@RequiredUserTransactionEntityManager.getTransaction

(还有更多的细微之处,例如 PersistenceContextType 或使用 EntityManager.joinTransaction 在分布式事务中手动登记实体管理器,但前提是您以不同的方式使用这些技术作为默认值)。


答案 2

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

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

资源本地事务与 JTA 事务有很大不同:除其他外,资源本地事务特定于资源,而 JTA 事务往往特定于特定线程。

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


推荐