RESOURCE_LOCAL JPA 事务类型


这篇文章详细分析了在Spring Boot或Spring Data JPA中默认使用的RESOURCE_LOCAL事务类型是如何工作的。

文章首先介绍了JPA事务类型的背景,提到JPA 1.0规范发布时有两种事务类型:JTA(Java Transaction API)和RESOURCE_LOCAL。JTA允许跨多个数据库连接、缓存或JMS队列进行全局事务管理。使用JTA时,需要在persistence.xml文件中进行特定的配置。

如果不需要全局事务,JPA提供了RESOURCE_LOCAL事务类型,它可以使用单个数据库连接进行操作。选择这种事务模式时,需要将transaction-type属性设置为RESOURCE_LOCAL,并使用指向JDBC DataSource的non-jta-data-source元素。

使用RESOURCE_LOCAL事务类型时,JDBC Connection如何管理底层数据库事务?

  • 默认情况下,JDBC Connection使用自动提交模式,JPA提供者会禁用它(如果之前没有被禁用)。
  • 数据库连接绑定到当前执行的线程,并用于所有语句执行,直到事务结束。

在工作单元结束时,如果没有检测到失败,将调用关联JDBC Connection上的commit方法,数据库事务也将被提交。如果检测到失败,则调用rollback方法。

使用RESOURCE_LOCAL事务类型时,数据库事务由底层JDBC Connection管理。

在Spring中,TransactionInterceptor将调用底层TransactionManager的commit或rollback。

  • 对于RESOURCE_LOCAL事务类型,Spring提供了JpaTransactionManager,
  • 而对于JTA,则必须使用JtaTransactionManager。

详细点击标题