spring this呼叫方法 事務失效分析

2021-08-23 12:38:40 字數 3801 閱讀 3006

問題

a方法,b方法,都通過aop加上了事物控制,a中呼叫了b方法,那麼一共幾次事物

準備

1.建立資料庫

-- 建立資料庫

use test;

-- 建表

create table account(

id int not null auto_increment,

name varchar(20) not null ,

money double not null

);insert into account(id,name,money) value

(1,"aaa",1000),

(1,"bbb",1000),

(1,"ccc",1000)

2.xml配置,例項化了兩個 service 類,乙個dao類,開啟事務註解驅動

3.dao 類

public class accountdaoimpl extends jdbcdaosupport implements accountdao 

@override

public void reduce(string name, double money)

}

4.service 類

// service 1

public class accountserviceimpl implements accountservice catch (exception e)

}public void add(string to, double money)

public void reduce(string to, double money)

}// service 2

public class accountserviceimpl2

}

5.測試類

@runwith(springjunit4classrunner.class)

public class testservice

}

測試1.當 a , b 方法在同乙個類中時,兩個方法的 事務傳播行為都設定為propagation.required

accountserviceimpl 中transfer 的內容為

@transactional(propagation = propagation.required, readonly = false)

@override

public void transfer(string from, string to, double money) catch (exception e)

}

accountserviceimpl 中reduce 的內容為

@transactional(propagation = propagation.required, readonly = false)

public void reduce(string to, double money)

測試結果:

當設定accountserviceimpl 中transfer 的傳播行為是propagation.required,accountserviceimpl 中reduce 的傳播行為是requires_new 時,

測試結果:

2.當 a , b 方法不在同乙個類中時,兩個方法的 事務傳播行為都設定為propagation.required

accountserviceimpl 中transfer 的內容為

@transactional(propagation = propagation.required, readonly = false)

@override

public void transfer(string from, string to, double money) catch (exception e)

}

accountserviceimpl2 中reduce 的內容為

@transactional(propagation = propagation.required, readonly = false)

public void reduce(string to, double money)

測試結果:

當設定accountserviceimpl 中transfer 的傳播行為是propagation.required,accountserviceimpl2 中reduce 的傳播行為是propagation.requires_new 時,

測試結果:

總結:

1.當a,b方法在同乙個類中時,不管 b 方法設定何種 傳播行為,a,b方法都共用乙個事務(具體實現方式還未深究)。

2.當a,b方法不在同乙個類中時,事務的傳播行為看 b 方法的註解配置,b 方法配置 propagation.required 是,與a方法共用事務,

當 b 中產生異常,b 方法把 事務 標記 為回滾,然後把異常拋給 a 方法,a 方法對異常進行了捕獲,所以 a 方法內無異常,a方法會 對事務 進行提交操作,但是b 方法已經把 該事務 標記為 回滾,所以 會丟擲異常。解決這個的辦法就是把 b 方法配置為 propagation.requires_new,這樣 b 方法會產生新的 事務,結果就是 b 的事務回滾,a 的事務正常提交

但是對於該部落格的分析中,我還是有點疑問 :

博文中說 當呼叫本類方法時,此時的 this 是指向被**的物件的

測試確實如此,那為什麼不是 指向 spring 生成的**類呢?

希望知道的朋友能知導一二,謝謝!

又找到了兩個說的很透徹的鏈結了!

jdk 動態**

jdkdynamicaopproxy 類的invoke方法
cglib動態**

cglibaopproxy 類中設定了callback   為 dynamicadvisedinterceptor 類
我們配置的 aop 切面,實際是以責任鏈的方式執行的,然後呼叫的*被**的物件*執行響應的方法,所以在方法中斷點檢視this物件,發現不是**物件,就是當前的類。

Service 呼叫 Service方法 事務失效

情況1 介面方法沒有新增 transactional 註解,事務不會開啟,如果該方法體內呼叫其他有事務的方法時,且呼叫方法為this.method 時,那麼被呼叫的方法即使新增了 transactional 註解 也不會有事務產生 如呼叫方法1 情況2 介面方法沒有新增 transactional ...

SpringBoot 類中方法呼叫方法事務失效問題

sevice public class test transactional public void b 此時事務時不生效的,因為 transactional註解事務是通過 來控制的,方法呼叫本類方法,事務不會生效。解決方法 增加該註解開啟 enableaspectjautoproxy proxyt...

初探類的字段 屬性 方法 事件

tmyevent procedure of object tmyclass class private fage integer fonhundred tmyevent procedure setage const value integer public procedure setonhundre...