在SSM中配置瞭事務控制但沒生效的問題
SSM配置瞭事務控制但沒生效
今天在使用ssm事務時,發現方法報錯,事務沒有回滾,弄瞭半天,終於解決,下面記錄一下 ,本人是使用編程式事務,即使用配置文件 的方式。
包結構,下面是springmvc.xml配置文件
spring配置文件:applicationContext.xml
首先我們明確spring進行掃描註入時,因為spring的context是父子容器,ContextLoaderListener監聽器加載spring配置文件,產生的是父容器,mvc加載mvc的配置文件,產生瞭子容器,子容器對@Controller進行裝配掃描時,也裝配瞭@Service註解的實例,因為@Contoller實例依賴@Service實例,當子容器中有瞭@Service實例,我們使用B/S或C/S時對數據庫進行操作時,如果子容器中有@Service實例,則mvc優先使用自身即子容器中的@Service實例,但是@Service註解的實例,也就是一般的事務控制層,應該是由父容器初始化,以保證事務的增強處理,否則會失去事務處理能力。
因此我們要保證子容器中沒有@Service註解的實例
我的錯誤之處
因此也就有瞭上面的兩個掃描,但我的springmvc.xml配置文件是有問題的,我沒有明白 context:include-filter的含義。
通俗點講:
context:exclude-filter
是設置黑名單。比如手機黑名單,在黑名單中的人是無法打進電話的。context:include-filter
是設置白名單。在手機白名單中的號碼可以打進來,不在白名單也不在黑名單中的也可以打進來。 所以需要針對白名單過濾進行設置,把默認的過濾器關閉,即使用use-default-filters=“false”;然後他就僅僅掃描指定註解瞭。
這樣就可以瞭,當然由於我的@Contoller註解的實例 都在com.djw.controller包中,我也可以如下做
SSM事務配置不起作用,不回滾的幾個原因
我是小白一枚,之前事務沒學好,所以做項目的時候沒怎麼好好研究,現在項目快做完瞭,要把事務加進去,卻老是不起效果,後來終於配(抄)好瞭
總結幾點我事務配置失敗的原因
1.@Transactional在使用這個註解的時候,我就是直接在類上面加上這個註解,後來發現還少瞭一點東西,應該這樣寫@Transactional(rollbackFor = Exception.class)
2.<context:component-scan base-package="com.service" />
註解掃描component-scan放錯瞭地方,之前是放在spring-mvc裡面,後來看到別人的博客說是要放在spring-mybatis裡面,於是我就放過去,可是還是沒用 後來發現,原來是spring-mvc裡面還有一個註解掃描component-scan,然後把這個刪瞭,註解完美生效
下面是基本使用的代碼
spring-mybatis:
<!-- 配置事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <context:component-scan base-package="com.service" /> <!-- 註解方式配置事務 --> <tx:annotation-driven transaction-manager="transactionManager" />
serviceImpl:
@Service @Transactional(rollbackFor = Exception.class) public class TestServiceImpl implements ITestService { @Override public void del(int id) throws Exception { address.delete(aid); int i=1/0; } }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Spring和SpringMVC掃描註解類沖突的解決方案
- Java開發之ssm三大框架整合
- Spring @Async無法實現異步的解決方案
- 解決@Transactional註解事務不回滾不起作用的問題
- Spring框架 註解配置事務控制的流程