天天看点

Spring JPA无法提交jdbc事务的解决办法

项目中使用了spring jpa与spring jdbc但在实际使用中发现spring jdbc中的事务没有被提交到,处理方式主要有以下几点

  1. 确保工程中启用了事务
@EnableTransactionManagement           
  1. 确保在方法上添加了事务注释
@Transactional           

这两点在系统中都已经添加,但还是不生效,查看spring jpa的文档发现确实是支持jpa的事务和jdbc的事务

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/orm/jpa/JpaTransactionManager.html

,通过debug发现Jpa的事务处理主要在

JpaTransactionManager.doBegin

中,在执行时会判断是否使用jdbc的事务;

Spring JPA无法提交jdbc事务的解决办法

系统中指定了

JpaTransactionManager

但没有指定

jpaDialect

,如果不指定默认给的是

DefaultJpaDialect

,而

DefaultJpaDialect

中并不会对

JdbcConnection

做处理,所以就导致了jdbc事务无法提交,解决办法也比较简单手动指定

jpaDialect

HibernateJpaDialect

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" primary="true">
  <property name="entityManagerFactory" ref="entityManagerFactory"/> 
  <property name="jpaDialect">
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"></bean> 
  </property>
 </bean>