簡體   English   中英

春季數據:JPA和嵌套事務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM