開發與維運

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的事務;
image.png

系統中指定了JpaTransactionManager但沒有指定jpaDialect,如果不指定默認給的是DefaultJpaDialect,而DefaultJpaDialect中並不會對JdbcConnection做處理,所以就導致了jdbc事務無法提交,解決辦法也比較簡單手動指定jpaDialectHibernateJpaDialect

<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>

Leave a Reply

Your email address will not be published. Required fields are marked *