@Transactional注解不回滾原因詳解


最近試了試spring的回滾功能,根據網上的教程配置怎么都不好使,遂尋找答案,

網上的答案都是這么講的:

1. 檢查你方法是不是public的。

2. 你的異常類型是不是unchecked異常。
如果我想check異常也想回滾怎么辦,注解上面寫明異常類型即可。

@Transactional(rollbackFor=Exception.class)

類似的還有norollbackFor,自定義不回滾的異常。

3. 數據庫引擎要支持事務,如果是mysql,注意表要使用支持事務的引擎,比如innodb,如果是myisam,事務是不起作用的。

4. 是否開啟了對注解的解析

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

5. spring是否掃描到你這個包,如下是掃描到org.test下面的包

<context:component-scan base-package="org.test" ></context:component-scan>

我都檢查了,但就是不回滾,再找,終於發現了問題在哪兒.

一般我們在Spring的配置文件application.xml中對Service層代碼配置事務管理,可以對Service的方法進行AOP增強或事務處理如事務回滾,但是遇到一個問題,在Controller類中調用Service層方法,配置的事務管理會失效,查詢相關資料發現原因。其實Spring和SpringMVC倆個容器為父子關系,Spring為父容器,而SpringMVC為子容器。也就是說application.xml中應該負責掃描除@Controller的注解如@Service,而SpringMVC的配置文件應該只負責掃描@Controller,否則會產生重復掃描導致Spring容器中配置的事務失效。

最主要的是springmvc的配置文件,不能配置重復掃描Service,

可以這樣配置

<context:component-scan base-package="com.zj.module.batis.controller"/>,

也可以

<context:component-scan base-package="com.zj.module.batis">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Service" />
</context:component-scan>

直接過濾掉Service.

 

兩位博主的鏈接:

1.https://www.cnblogs.com/wuxiaofeng/p/6819209.html

2.https://blog.csdn.net/qq_32588349/article/details/52097943


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM