Transactional事物失效解決

2021-10-03 13:35:44 字數 1077 閱讀 8551

這麼乙個類

public

class

foopublic

void

baz(

)}

可能會有不少人會跟我一樣,覺得上面這種方式呼叫 baz()方法時,bar()上的@transactional註解還是會起作用的,即bar()在被呼叫時,將會開啟事務。 但是,當實際操作之後,你會發現,這樣並不會開啟新的事務?

為什麼呢?

我們知道,spring之所以可以對開啟@transactional的方法進行事務管理,是因為spring為當前類生成了乙個**類,然後在執行相關方法時,會判斷這個方法有沒有@transactional註解,如果有的話,則會開啟乙個事務。

但是,上面這種呼叫方式時,在呼叫baz()時,使用的並不是**物件,從而導致this.bar()時也不是**物件,從而導致@transactional失敗。

解決方式

1、非springboot專案 在spring的xml中加上如下配置

springboot專案 在springboot 入口類中新增 @enableaspectjautoproxy(exposeproxy = true) 註解

@enableaspectjautoproxy

(exposeproxy =

true

)public

class

}2、新增依賴

org.springframework<

/groupid>

spring-aspects<

/artifactid>

5.1.2

.release<

/version>

<

/dependency>

3、呼叫方式調整為((foo) aopcontext.currentproxy()).bar();

public

class

foopublic

void

baz(

)}

還可以將本類作為乙個bean注入,然後再呼叫也可以開啟事物,

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...