spring的事務管理要在xml文件中進行配置,包括
事務管理器:
<!-- 給數據源配置事務管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
開啓事務:
<!-- 啓動配置好的事務管理 -->
<tx:annotation-driven transaction-manager="transactionManager" />
然後在想要實現事務管理的方法上面添加 @Transactional 註解即可,添加註解的方法要是public方法,也可以添加在類上面,表示類中所有方法都實現事務管理,
當方法拋出異常時spring會自動回滾事務,常用
throw new RuntimeException();
當需要方法正常返回時,也可以手動回滾
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
事務管理一般放在service層
SpringMVC+MyBatis事務不回滾問題的解決辦法
Spring容器優先加載由ServletContextListener(對應root-context.xml)產生的父容器,而SpringMVC(對應mvc_dispatcher_servlet.xml)產生的是子容器。子容器Controller進行掃描裝配時裝配的@Service註解的實例是沒有經過事務加強處理,即沒有事務處理能力的Service,而父容器進行初始化的Service是保證事務的增強處理能力的。如果不在子容器中將Service exclude掉,此時得到的將是原樣的無事務處理能力的Service,因爲在多上下文的情況下,
如果同一個bean被定義兩次,後面一個優先。
注意:一個bean被定義兩次,後面一個優先。這一點很重要,之前我就遇到這個問題,事務管理始終不好使。
事務管理也可以放在controller層,只要將啓動事務的代碼從spring-bean.xml移到spring-mvc.xml中就可以了。
https://blog.csdn.net/java_2017_csdn/article/details/77882162