Spring事務不生效問題彙總
阿新 • • 發佈:2019-01-11
在實際專案開發中,經常會由於配置錯誤或使用不當,導致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屬性執行。