項目中使用了spring jpa與spring jdbc但在實際使用中發現spring jdbc中的事務沒有被送出到,處理方式主要有以下幾點
- 確定工程中啟用了事務
@EnableTransactionManagement
- 確定在方法上添加了事務注釋
@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的事務;

系統中指定了
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>