Spring事務(wù)不生效問題匯總

轉(zhuǎn)自:http://blog.csdn.net/zhu_tianwei/article/details/72848654

在實際項目開發(fā)中,經(jīng)常會由于配置錯誤或使用不當(dāng),導(dǎo)致spring事務(wù)管理不生效。如下總結(jié)了幾點事務(wù)不生效的情況:

1、確認(rèn)創(chuàng)建的mysql數(shù)據(jù)庫表引擎是InnoDB,MyISAM不支持事務(wù)。

2、確認(rèn)調(diào)用的類是由spring容器管理的代理類。

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

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

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

5、拋出一個runtimeException才能回滾。
Spring使用聲明式事務(wù)處理,默認(rèn)情況下,如果被注解的數(shù)據(jù)庫操作方法中發(fā)生了unchecked異常,所有的數(shù)據(jù)庫操作將rollback;如果發(fā)生的異常是checked異常,默認(rèn)情況下數(shù)據(jù)庫操作還是會提交的。
Java異常之checked與unchecked:http://www.cnblogs.com/shihuc/p/5201905.html
Exception這個父類是checked類型,但是其子類RuntimeException (子類NullPointerException等)是unchecked的。

checked與unchecked在throwable中的繼承關(guān)系

6、Spring的事務(wù)傳播策略在內(nèi)部方法調(diào)用時將不起作用。

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事務(wù)的傳播機(jī)制:
Propagation支持7種不同的傳播機(jī)制:
REQUIRED:如果存在一個事務(wù),則支持當(dāng)前事務(wù)。如果沒有事務(wù)則開啟一個新的事務(wù)。
SUPPORTS: 如果存在一個事務(wù),支持當(dāng)前事務(wù)。如果沒有事務(wù),則非事務(wù)的執(zhí)行。但是對于事務(wù)同步的事務(wù)管理器,PROPAGATION_SUPPORTS與不使用事務(wù)有少許不同。
NOT_SUPPORTED:總是非事務(wù)地執(zhí)行,并掛起任何存在的事務(wù)。
REQUIRESNEW:總是開啟一個新的事務(wù)。如果一個事務(wù)已經(jīng)存在,則將這個存在的事務(wù)掛起。
MANDATORY:如果已經(jīng)存在一個事務(wù),支持當(dāng)前事務(wù)。如果沒有一個活動的事務(wù),則拋出異常。
NEVER:總是非事務(wù)地執(zhí)行,如果存在一個活動事務(wù),則拋出異常
NESTED:如果一個活動的事務(wù)存在,則運(yùn)行在一個嵌套的事務(wù)中。如果沒有活動事務(wù),則按REQUIRED屬性執(zhí)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 事務(wù)的嵌套概念 所謂事務(wù)的嵌套就是兩個事務(wù)方法之間相互調(diào)用。spring事務(wù)開啟 ,或者是基于接口的或者是基于類的...
    jackcooper閱讀 1,501評論 0 10
  • 概述事務(wù)管理對于企業(yè)應(yīng)用來說是至關(guān)重要的,即使出現(xiàn)異常情況,它也可以保證數(shù)據(jù)的一致性。Spring Framewo...
    沉默羔羊121閱讀 1,167評論 0 0
  • 1 事務(wù) 1.1 事務(wù)管理方式 spring支持編程式事務(wù)管理和聲明式事務(wù)管理兩種方式。 編程式事務(wù)管理使用Tra...
    鑫奕航閱讀 2,900評論 0 1
  • spring,mybatis事務(wù)管理配置與@Transactional注解使用 概述 事務(wù)管理對于企業(yè)應(yīng)用來說是至...
    tenlee閱讀 4,301評論 0 11
  • 事務(wù)的嵌套概念 所謂事務(wù)的嵌套就是兩個事務(wù)方法之間相互調(diào)用。spring事務(wù)開啟 ,或者是基于接口的或者是基于類的...
    pigstomachs閱讀 1,100評論 0 1

友情鏈接更多精彩內(nèi)容