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

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

Linda Hamilton
Linda Hamilton原創
2024-12-19 04:47:09478瀏覽

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