Java JTA模式下的JPA和事务(开始和提交)

Java JTA模式下的JPA和事务(开始和提交),java,hibernate,jpa,transactions,jta,Java,Hibernate,Jpa,Transactions,Jta,我用JPA练习了JTA和RESOURCE\u LOCAL模式,这两种模式之间存在巨大差异 当我使用RESOURCE\u LOCAL时,我必须使用EntityTransaction自己管理事务,当我使用JTA时,它由应用服务器隐式完成 所以我想知道在JTA模式下何时执行begin()和commit()方法 我假设当应用服务器收到HTTP请求时,它执行“begin()”,在向客户端发送HTTP响应之前,它执行“commit()”;此外,如果在发送响应之前发生错误,它将执行“回滚()。我说得对吗?JP

我用JPA练习了JTARESOURCE\u LOCAL模式,这两种模式之间存在巨大差异

当我使用RESOURCE\u LOCAL时,我必须使用EntityTransaction自己管理事务,当我使用JTA时,它由应用服务器隐式完成

所以我想知道在JTA模式下何时执行begin()和commit()方法


我假设当应用服务器收到HTTP请求时,它执行“begin()”,在向客户端发送HTTP响应之前,它执行“commit()”;此外,如果在发送响应之前发生错误,它将执行“回滚()。我说得对吗?

JPA规范没有定义在使用JTA事务工作时触发
开始
提交
的确切位置

事务控制与HTTP请求/响应无关,它们不会触发事务控制

JTA事务将为所有事务方法(每个默认值都是EJB方法)提供,与它们的用途无关


然而,考虑到JTA交易和JPA,有一些担保。事务保证在第一次调用
EntityManager
时启动,并保证在方法返回之前提交或回滚。

实际上,我认为默认情况下(对于JTA),事务由EJB方法分隔。因此,servlet必须调用EJB方法,事务将在EJB方法的开头开始,并在EJB方法的结尾结束(或回滚)。看这个文档看起来很旧,自从JPA 2.0和EJB3.1使用JTA模式以来,很多事情都发生了变化,要么是由应用服务器完成,要么是由您自己从UserTransaction完成。是的,我想知道应用服务器如何实现其UserTransaction,以及我在最后一段中所说的是否正确。非常有趣,因此,这意味着JTA模式只是一种“syntactic sugar”奖励?不是真的-可用事务的类型取决于应用程序运行的环境。在像Tomcat这样的Servlet容器中,您只能使用RESOURCE-LOCAL,所以为了使用事务,您需要显式地划分它们。有时,这不是一项微不足道的任务。在符合JavaEE的容器中,JTA事务是EJB的“免费红利”。如果可以的话,我想不出不使用JTA TX的理由。我看到了不使用JTA的一个理由:如果我有一个带有CRUD方法的DAO,我可能希望在另一个方法中使用其中一个方法(主要是创建、更新和删除操作)。那么,如果事务在方法返回之前结束,会发生什么?嵌套事务?我了解到JPA和JTA不支持此处的嵌套事务:。感谢您可以在其他事务性方法中调用事务性方法,这可以在没有TX嵌套的情况下完成。当内部事务处于活动状态时,外部事务被挂起。如果内部事务失败,您可以选择回滚外部事务或保留并提交它(通过捕获相应的异常)。无法从外部事务回滚内部事务。如果内部事务成功,但外部事务在结束前启动异常,则情况将不好。外部方法和内部调用的方法的事务不应该相同吗?