首頁 > Java > java教程 > 為什麼從同一個類別中呼叫方法時我的 Spring @Transactional 註解不起作用?

為什麼從同一個類別中呼叫方法時我的 Spring @Transactional 註解不起作用?

Susan Sarandon
發布: 2024-12-27 10:25:24
原創
841 人瀏覽過

Why Doesn't My Spring @Transactional Annotation Work When Calling a Method from Within the Same Class?

Spring 事務:處理同一個類別內的方法呼叫

使用@Transactional 註解方法來處理事務時,可能會出現意外行為從同一個類別中呼叫該方法時。事務可能無法如預期應用。

要解決此問題,必須了解 Spring 預設使用 AOP(面向方面​​程式設計)來實現事務管理。當 CGLIB 用於 AOP(這是預設值)時,它會為帶有註解的類別建立一個代理實例。這意味著當從同一個類別中呼叫某個方法時,它會與代理實例而不是原始類別進行交互,從而導致事務無法應用。

解決方案:啟用 AspectJ 進行事務管理

要克服此限制,您可以透過新增以下內容在 Spring 配置中啟用 AspectJ進行事務管理code:

<tx:annotation-driven mode="aspectj"/>
登入後複製

透過設定AspectJ,Spring將使用AspectJ來管理事務,這將解決同一個類別內方法呼叫的問題。

替代方法:重構程式碼

如果您不想使用 AspectJ,另一種方法是重構程式碼並分離交易處理進入不同的類別或服務。透過這樣做,可以從單獨的類別中呼叫帶註釋的事務方法,並且事務將被正確地應用。

例如,考慮以下程式碼:

public class UserService {

    private UserServiceHelper helper;

    public boolean addUser(String userName, String password) {
        return helper.addUser(userName, password);
    }
}

public class UserServiceHelper {

    @Transactional
    public boolean addUser(String userName, String password) {
        // Transactional logic...
    }
}
登入後複製

在本例中,事務方法 addUser 定義在輔助類別中,UserService 類別呼叫此方法。在這種情況下交易將被正確地應用。

以上是為什麼從同一個類別中呼叫方法時我的 Spring @Transactional 註解不起作用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板