1.首先檢查配置,在項目的spring配置文件檢查是否配置開啓事務:
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="routeDataSource" />
- </bean>
- <!-- 事務 -->
- <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
2.同一個類中, 一個未標註@Transactional的方法去調用標有@Transactional的方法, 事務會失效
If you use (default) Spring Proxy AOP, then all AOP functionality provided by Spring (like @Transational) will only be taken into account if the call goes through the proxy. -- This is normally the case if the annotated method is invoked from another bean.
3:在非public方法上標註@Transactional, 事務無效
When using proxies, you should apply the @Transactional annotation only to methods with public visibility. If you do annotate protected, private
or package-visible methods with the @Transactional annotation, no error is raised, but the annotated method does not exhibit the configured
transactional settings. Consider the use of AspectJ (see below) if you need to annotate non-public methods.
<!-- 事務設置 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<!-- 事務使用AspectJ進行編譯時Weave -->
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>