1. 程式人生 > >Spring MVC @Transactional註解不生效

Spring MVC @Transactional註解不生效

最近換了一份工作,公司用的SSM,在開發過程中發現了使用事務註解@Transactional無效,問了其他同事,貌似其他專案也是同樣的問題…只好自己百度解決

網上有幾種失效的原因,這裡大致說一下

1. 配置檔案未開啟事務控制的註解支援

xml配置: 新增配置<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> Java配置 添加註解 @EnableTransactionManagement

2. 在方法中呼叫同一個類的其他方法

在代理下(預設或當配置為proxy-target-class=“true”),只有當前代理類的外部方法呼叫註解方法時代理才會被攔截。事實上,這意味著:一個目標物件的方法呼叫該目標物件的另外一個方法,即使被呼叫的方法已使用了@Transactional註解標記,事務也不會有效執行。

3. 捕獲異常或非RuntimeException

只有丟擲異常時事務才會生效,預設處理執行時異常,如果需要捕獲異常並且回滾,可以通過程式設計式事務進行管理,如果需要處理其他異常,可根據自己需要設定@Transactional(rollbackFor = Exception.class)

4.bean重複掃描

我遇到的就是這樣的問題。 Spring容器優先載入由ServletContextListener(對應applicationContext.xml)產生的父容器,而SpringMVC(對應springmvc.xml)產生的是子容器。子容器Controller進行掃描裝配時裝配的@Service註解的例項是沒有經過事務加強處理,即沒有事務處理能力的Service,而父容器進行初始化的Service是保證事務的增強處理能力的。如果不在子容器中將Service exclude掉,此時得到的將是原樣的無事務處理能力的Service。 springmvc.xml包掃描配置:

<context:component-scan base-package="com.zyhl.zyyp.*"></context:component-scan>

這個配置將專案裡的所有類又掃描了一遍,這裡只掃描spring mvc 相關的類就好了,或者排除@Service註解

<context:component-scan base-package="com.zyhl.zyyp.*">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"
/>
</context:component-scan>

修改後測試有異常時可以回滾了。