學習java,事務一般都是項目中不可或缺的,只是有些時候用的較少,所以接觸也比較少,但對於這個東西必須要記錄一下,不管是面試還是工作中,一定會遇到。
兩種事務管理方式:
- 編碼式事務管理:將事務控制代碼編寫在業務代碼之中。
- 聲明式事務管理:基於AOP(面向切面編程),事務管理與業務邏輯解耦。聲明式事務管理的兩種實現:
- 在配置文件(xml)中配置。
- 基於@Transactional註解。
在Springboot項目中,一般用@Transactional註解
1.開啓事務註解
在項目主類上,加上註解@EnableTransactionManagement開啓事務註解(ps:一般無需配置)
@EnableTransactionManagement
public class ICApiApplication {
public static void main(String[] args) {
SpringApplication.run(ICApiApplication.class, args);
}
}
2.在目標類、方法上添加註解@Transactional
2.1 如果註解在目標類上,則表示此類所有方法都開啓事務
2.2 如果註解在目標方法上,則表示只有此方法開啓事務
2.3 如果一個方法上存在@Transactional,且其所屬類上同樣存在@Transactional,則以方法級別的事務配置爲準。
3.是否發生了自調用問題
3.1 只有當事務方法被當前類以外的代碼調用時,纔會才由 Spring 生成的代理對象來管理。
3.2 自調用問題:當事務方法被本類內部方法調用時,@Transactional並不生效。
3.2.1 同一個類中,非事務方法調用事務方法,當事務方法發生異常時,事務控制無效,不會回滾
3.2.2 同一個類中,事務方法調用非事務方法,當發生異常時,事務控制有效,因爲事務方法被外部代碼調用;即使非事務方法又調用事務方法,事務依然有效,此時事務已經開啓管理
4.對所有異常都回滾
@Transactional(rollbackFor = Exception.class)
參考來源:https://blog.csdn.net/hanchao5272/article/details/90343882