首頁 > Java > java教程 > 為什麼在Spring中同一個類別中自呼叫@Transactional方法會失敗?

為什麼在Spring中同一個類別中自呼叫@Transactional方法會失敗?

Linda Hamilton
發布: 2024-12-19 04:47:09
原創
475 人瀏覽過

Why Do @Transactional Methods Fail When Self-Invoked Within the Same Class in Spring?

同一類別內的交易方法呼叫問題

問題:

在Spring 中,試著呼叫帶有註解的方法來自同一個類別的@Transaction可能會導致無效

程式碼範例:

public class UserService {

    @Transactional
    public boolean addUser(String userName, String password) {
        // ...
    }

    public boolean addUsers(List<User> users) {
        for (User user : users) {
            addUser(user.getUserName, user.getPassword);
        }
    }
}
登入後複製

理解問題:

此問題是由於Spring 的限制而出現的AOP的動態物件處理和cglib的使用。 Spring 的預設事務處理機制使用使用 cglib 建立的動態代理,這可能會導致從同一個類別中呼叫事務方法時出現不一致。

解決方案:

使用AspectJ 進行事務處理:

要解決此問題,您可以設定Spring使用AspectJ來處理事務。這涉及到:

  • 在tx:annotation-driven: 將模式設定為aspectj:

    <tx:annotation-driven mode="aspectj"/>
    登入後複製
  • 僅添加以下bean配置(僅添加以下bean配置(僅添加。適用於下面是Spring版本3.0):

    <bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf">
      <property name="transactionManager" ref="transactionManager"/>
    </bean>
    登入後複製

重構:

另一個解是重構程式碼。不要從同一個類別中呼叫事務方法,而是考慮為使用者處理和處理建立單獨的類,以使用 Spring AOP 啟用預設事務處理。

以上是為什麼在Spring中同一個類別中自呼叫@Transactional方法會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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