我遇到了 Spring JPA Data 和嵌套事務的問題。以下是我的服務的嵌套事務的兩種方法。@Servicepublic 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 方法上拋出異常,甚至不會執(zhí)行。因為該方法UserService.saveUser將傳播設置為Propagation.REQUIRES_NEW我期望提交該事務(要執(zhí)行的 SQL 語句)并且傳播任何異常。我沒有設置任何與事務相關的東西,所以我相信刷新模式設置為自動。誰能發(fā)現我做錯了什么或我的誤解是什么?
1 回答

斯蒂芬大帝
TA貢獻1827條經驗 獲得超8個贊
這是因為您正在@Transactional從同一個 bean 中調用方法。
@Transactional僅適用于在 spring 創(chuàng)建的代理上調用的方法。這意味著,當您創(chuàng)建 @Service 或其他 bean 時,從外部調用的方法將是事務性的。如果從 bean 中調用,什么都不會發(fā)生,因為它不通過代理對象。
最簡單的解決方案是將方法移動到另一個 @Service 或 bean。如果你真的想將它保存在同一個組件中,那么你需要調用它,以便它被 spring AOP 包裝在代理中。你可以這樣做:
private YourClass self;
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void postContruct(){
self = applicationContext.getBean(YourClass.class);
}
然后調用方法self將導致打開事務。
換句話說:你沒有遇到任何這些異常,因為@TransactionaloversaveUser不起作用。
添加回答
舉報
0/150
提交
取消