問題:
在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中文網其他相關文章!