java - UserTransaction 和 EntityTransaction 的区别

标签 java jpa transactions jakarta-ee jta

标题说明了一切:UserTransaction 之间有什么区别?和一个 EntityTransaction

我的初步理解是 UserTransaction 在需要 JTA 时使用(例如,对多个事物进行查询),而 EntityTransaction 在仅需要 JPA 时使用(例如,当查询是原子的时)。

这是两者之间的唯一区别还是除此之外还有更多区别?

最佳答案

My rudimentary understanding is that UserTransaction is used when JTA is required (e.g. to do queries on mulitple things), and that EntityTransaction is used when JPA only is required (e.g. when the query is atomic).

基本上是对的,但是你对“多个事物”和“原子”的描述有点奇怪。 JTA 允许开发人员使用分布式事务以原子方式(全有或全无)对多个资源(数据库、JMS 代理等)执行更改。如果只访问一种资源(例如,一个数据库),则不需要 JTA,但事务仍然是原子的(全有或全无)。例如,当您在一个数据库上使用常规 JDBC 事务时就是这种情况。

考虑 UserTransactionEntityTransaction:

  • 如果 JPA 是独立使用的,您可以使用 EntityTransaction 来自己划分事务。
  • 如果在与 JTA 集成的托管环境中使用 JPA,则使用 UserTransactionEntityManager 将自身 Hook 到 JTA 分布式事务管理器中。我所知道的唯一微妙之处在于变化的齐平。使用 EntityTransaction 时,JPA 知道它需要刷新更改。如果使用 UserTransaction 控制事务,则需要使用 JTA 注册回调 registerSynchronization ,以便在事务完成之前将更改刷新到数据库。如果您将 EJB 与 CMT(容器管理的事务)一起使用,您甚至不需要使用 UserTransaction:应用服务器会为您启动和停止事务。

相关问题:

关于java - UserTransaction 和 EntityTransaction 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3078245/

相关文章:

java - 使用 ArrayList 打印素数

java - 如何JSP用一种布局显示多个页面(示例index.jsp?page=about显示about.jsp)

java - 如何在指定时区的 hibernate 中获取记录?

EclipseLink添加一个Converter会间歇性地导致ValidationException

java - 如果 postgres 中的 autocommit 为 false,事务将自动回滚

java - 将整数添加到 ArrayList<Integer>

java - 为什么 Spring 不将映射注入(inject)到子 Struts 2 Action 类中,而是注入(inject)父对象的对象?

hibernate - 如何在 play 框架中运行 JPA 查询

java - 为什么插入两条相同的记录事务不回滚

javascript - Redis MULTI 事务在 NodeJS 中的 EXEC 回调中随机返回 null