[英]Spring Data: JPA and Nested Transaction
我在使用Spring JPA數據和嵌套事務時遇到問題。 以下是我的服務的嵌套事務的兩種方法。
@Service
public UserService {
@Transactional
public User createUser(UserDto userDto) {
....
user = saveUser(user);
sendEmail(user);
....
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public User saveUser(User user) {
return userRepository.save(user);
}
碰巧有一種情況,方法userRepository.save()應該引發異常,但是某種程度上沒有引發異常,看起來它正在等待父事務完成。 我期待在saveUser方法和sendEmail方法上引發的異常甚至不會執行。
因為方法UserService.saveUser
的傳播設置為Propagation.REQUIRES_NEW
所以我希望提交該事務(執行SQL語句),並傳播任何異常。
我沒有設置與事務相關的任何內容,因此我相信刷新模式設置為AUTO。
誰能發現我做錯了什么或我的誤解是什么?
這是因為您要從同一bean內調用@Transactional
方法。
@Transactional
僅適用於在spring創建的代理上調用的方法。 這意味着,當您創建@Service或其他bean時,從外部調用的方法將是事務性的。 如果從Bean中調用,則不會發生任何事情,因為它不會通過代理對象。
最簡單的解決方案是將方法移至另一個@Service或bean。 如果您真的想將其保留在同一組件中,則需要調用它,以便在Spring AOP中將其包裝在代理中。 您可以這樣做:
private YourClass self;
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void postContruct(){
self = applicationContext.getBean(YourClass.class);
}
然后在self
上調用方法將導致打開交易。
換句話說: 您沒有遇到任何這些異常,因為在saveUser
上使用@Transactional
saveUser
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.