這麼乙個類
可能會有不少人會跟我一樣,覺得上面這種方式呼叫 baz()方法時,bar()上的@transactional註解還是會起作用的,即bar()在被呼叫時,將會開啟事務。 但是,當實際操作之後,你會發現,這樣並不會開啟新的事務?public
class
foopublic
void
baz(
)}
為什麼呢?
我們知道,spring之所以可以對開啟@transactional的方法進行事務管理,是因為spring為當前類生成了乙個**類,然後在執行相關方法時,會判斷這個方法有沒有@transactional註解,如果有的話,則會開啟乙個事務。
但是,上面這種呼叫方式時,在呼叫baz()時,使用的並不是**物件,從而導致this.bar()時也不是**物件,從而導致@transactional失敗。
解決方式
1、非springboot專案 在spring的xml中加上如下配置
springboot專案 在springboot 入口類中新增 @enableaspectjautoproxy(exposeproxy = true) 註解
@enableaspectjautoproxy
(exposeproxy =
true
)public
class
}2、新增依賴
3、呼叫方式調整為((foo) aopcontext.currentproxy()).bar();
org.springframework<
/groupid>
spring-aspects<
/artifactid>
5.1.2
.release<
/version>
<
/dependency>
還可以將本類作為乙個bean注入,然後再呼叫也可以開啟事物,public
class
foopublic
void
baz(
)}
Transactional註解初見
之前一直使用宣告式事務,切面程式設計的配置方式讓程式設計者忘記了事務的存在,一旦離開,發現這個事務還是蠻重要的 public inte ce userservice transactional public class userserviceimpl implements userservice p...
Transactional配置詳解
1 事務的7種屬性 propagation required 支援當前事務,如果當前沒有事務,就新建乙個事務。預設配置,也是常用的選擇。propagation supports 支援當前事務,如果當前沒有事務,就以非事務方式執行。propagation mandatory 支援當前事務,如果當前沒有...
Transactional註解詳解
預設遇到throw new runtimeexception 會回滾 需要捕獲的throw new exception 不會回滾 指定回滾 transactional rollbackfor exception.class public void methodname 指定不回滾 transacti...