spring事務依賴的是資料庫的事務,在開發中如果沒有處理好,可能會遇到事務失效的情況,本文就盤點spring事務會失效的一些情況並給出解決方案。
spring事務分為宣告式事務和程式設計時事務兩種。看下宣告式事務。
使用@transactional做宣告式事務的一些說明
使用@transactional做宣告式事務的流程
通過幾個例項來解釋事務失效的問題
import lombok.extern.slf4j.slf4j;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.service;
import org.springframework.transaction.annotation.propagation;
import org.springframework.transaction.annotation.transactional;
/** * description:
* * @author liu.qq
* @create 2019-09-29 14:16
**/@service
@slf4j
public
class
testservice
catch
(exception e)
order order =
neworder()
; order.
setorderno
("parent");
order.
settitle
("parent");
order.
setstatus(0
);order.
setamount
(100);
insert
(order);}
@transactional
(propagation = propagation.requires_new)
public
void
child()
}
執行結果:child()執行成功,parent()執行成功,child()事務失效的根本原因是動態**導致的,只有被**物件直接呼叫的方法才能被**。這裡是testservice 物件直接呼叫的,而不是其**物件。所以child()方法的執行就相當於普通的方法的執行。
解決方案1:
從aop上下文獲取本類的**物件,使用**物件執行child()。
@transactional
public
void
parent()
catch
(exception e)
order order =
neworder()
; order.
setorderno
("parent");
order.
settitle
("parent");
order.
setstatus(0
);order.
setamount
(100);
insert
(order)
;}
執行結果:child()失敗,parent()成功。
解決方案2:
從spring容器獲取被**類的**物件,使用**物件執行child()方法。
package cn.arbexpress.court.transactional;
import lombok.extern.slf4j.slf4j;
import org.springframework.aop.framework.aopcontext;
import org.springframework.beans.bean***ception;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.service;
import org.springframework.transaction.annotation.propagation;
import org.springframework.transaction.annotation.transactional;
/** * description:
* * @author liu.qq
* @create 2019-09-29 14:16
**/@service
@slf4j
public
class
testservice
implements
@transactional
public
void
parent()
catch
(exception e)
order order =
neworder()
; order.
setorderno
("parent");
order.
settitle
("parent");
order.
setstatus(0
);order.
setamount
(100);
insert
(order);}
@transactional
(propagation = propagation.requires_new)
public
void
child()
}
Spring事務失效的8個原因
1 mysql資料庫myisam不支援事務,層面做再多也無用。2 註解 transactional作用在非public方法上。3 註解 transactional作用在public方法上,但是該類沒有被spring管理,比如沒有在類上加註解 service 4 註解 transactional作用在...
spring事務失效
遇到的問題 前端時間我在做乙個父子事務巢狀的時候,出現了子事務失效。在同類的子事務上加事務註解一直都不能建立事務,後來發現是子事務失效了。下面總結一下事務失效情況和解決經驗 事務失效有如下幾種情況 沒有transaction註解 事務沒有丟擲runtimeexception異常到方法上 方法內丟擲r...
Spring 事務失效
1.丟擲檢查異常導致事務不能正確回滾 service public class service1 2.業務方法內自己 try catch 異常導致事務不能正確回滾 service public class service2 catch filenotfoundexception e 解法2 手動設定...