Springboot 事務失效原因
- @Transactional 註解 只能作用於public方法上,如果不是的話編譯報錯
- @Transactional 註解預設當發生RunTimeException才會回滾,如果發生其他異常不會,解決方法
@Transactional(rollbackFor = Exception.class)
- 自呼叫問題,假設一個service有一個事務方法a和一個普通方法b,a呼叫b事務不會失效,但反過來b呼叫a會導致事務失效,解決這個問題可以透過aop代理,或者在service裡再注入這個service(假設它為XXservice),在b方法裡透過XXservice呼叫a方法,反正就是要避開自呼叫
@Service
public class XXservice {
@Autowired
XXservice xxservice2; //注入一個相同的例項
@Transactional(rollbackFor = Exception.class)
public String a(){
//執行相關的資料庫操作
return "A";
}
public String b(){
xxservice2.a();
return "B";
}
}