Spring事務不生效問題彙總

在實際項目開發中,經常會由於配置錯誤或使用不當,導致spring事務管理不生效。如下總結了幾點事務不生效的情況:

1、確認創建的mysql數據庫表引擎是InnoDB,MyISAM不支持事務。

2、確認調用的類是由spring容器管理的代理類。

AopUtils.isAopProxy(Object object)
AopUtils.isCglibProxy(Object object) //cglib
AopUtils.isJdkDynamicProxy(Object object) //jdk動態代理
<aop:config proxy-target-class="true" />可強制cglib代理

3、調用的方法必須是public,否則事務不起作用。這一點由Spring的AOP特性決定的。

4、spring切點是否配置錯誤,或使用了springmvc,可能是context:component-scan重複掃描引起的。

5、拋出一個runtimeException才能回滾,Spring使用聲明式事務處理,默認情況下,如果被註解的數據庫操作方法中發生了unchecked異常,所有的數據庫操作將rollback;如果發生的異常是checked異常,默認情況下數據庫操作還是會提交的。

6、Spring的事務傳播策略在內部方法調用時將不起作用。

public int save(String name, int age) throws Exception {
        insert(name, age);
        return 1;
    }
    @Transactional
    public void insert(String name, int age){
        jdbcTemplate.update("insert into user(id,name,age)values(1,'"+name+"',"+age+")");
        jdbcTemplate.update("insert into user(id,name,age)values(2,'"+name+"',"+age+")");
        jdbcTemplate.update("insert into user(id,name,age)values(1,'"+name+"',"+age+")");
    }

Spring事務的傳播機制:
Propagation支持7種不同的傳播機制:
REQUIRED:如果存在一個事務,則支持當前事務。如果沒有事務則開啓一個新的事務。
SUPPORTS: 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。但是對於事務同步的事務管理器,PROPAGATION_SUPPORTS與不使用事務有少許不同。
NOT_SUPPORTED:總是非事務地執行,並掛起任何存在的事務。
REQUIRESNEW:總是開啓一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。
MANDATORY:如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。
NEVER:總是非事務地執行,如果存在一個活動事務,則拋出異常
NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中。如果沒有活動事務,則按REQUIRED屬性執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章