今天遇到 spring 事務不回滾問題。總結下緣由,方便之後拍錯mysql
1. 檢查你方法是否是public的。spring
2. 你的異常類型是否是unchecked異常。
若是我想check異常也想回滾怎麼辦,註解上面寫明異常類型便可。sql
@Transactional(rollbackFor=Exception.class)
相似的還有norollbackFor,自定義不回滾的異常。數據庫
3. 數據庫引擎要支持事務,若是是mysql,注意表要使用支持事務的引擎,好比innodb,若是是myisam,事務是不起做用的。spa
4. 是否開啓了對註解的解析component
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
5. spring是否掃描到你這個包,以下是掃描到org.test下面的包接口
<context:component-scan base-package="org.test" ></context:component-scan>
6.開啓註解必須放在掃描包後面,必須等待掃描完成後才能開啓事務,否則事務無效。事務
若是context:component-scan 配置了 屢次,以最後一個爲主。最好啓動註解和 掃描包放在一個文件裏面。get
若是你們遇到其餘問題。請提出來。一塊兒解決io
切記:由於spring事物是基於類和接口的因此只能在類裏面調用另外一個類裏面的事物,同一個類裏面調用本身類的事物方法是無效的。spring事物也不要頻繁使用,在事物處理的同時操做的第一張表會被限制查看的(即被臨時鎖住)。數據量大的時候會有必定影響。