管理事務的方式
- 編程式事務,在代碼中硬編碼,不推薦使用
- 聲明式事務,通過XML或者註解配置,推薦使用
事務的隔離級別
TransactionDefinition.ISOLATION_DEFAULT
: 使用後端數據庫默認的隔離級別,Mysql 默認採用的REPEATABLE_READ
隔離級別 Oracle 默認採用的READ_COMMITTED
隔離級別.
TransactionDefinition.ISOLATION_READ_UNCOMMITTED
: 最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致髒讀、幻讀或不可重複讀
TransactionDefinition.ISOLATION_READ_COMMITTED
: 允許讀取併發事務已經提交的數據,可以阻止髒讀,但是幻讀或不可重複讀仍有可能發生
TransactionDefinition.ISOLATION_REPEATABLE_READ
: 對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止髒讀和不可重複讀,但幻讀仍有可能發生。
TransactionDefinition.ISOLATION_SERIALIZABLE
: 最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。
事務傳播
事務傳播行爲用來描述由某一個事務傳播行爲修飾的方法被嵌套進另一個方法的時事務如何傳播。
七種事務傳播行爲:
常見的三種:
- Required
- 如果當前沒事務,就新建一個事務,如果已經存在一個事務中,就加入當前事務。
- 內層事務合併到外層事務中,所以不管何處發生回滾,整個外層事務都會回滾
- Requires_New
- 不管是否存在業務中都會新開啓一個業務
- 內層業務回滾不會影響其他內層業務,也不導致外層業務回滾
- 外層事務回滾不會導致其回滾
- Nested
- 如果外層沒有事務,開啓一個新事務;如果外層有事務,開啓一個新的子事務嵌套到外層事務中
- 子事務回滾不影響其他子事務,外層事務回滾,嵌套的子事務同樣回滾
@Transactional(rollbackFor = Exception.class)
在@Transactional註解中如果不配置rollbackFor屬性,那麼事物只會在遇到RuntimeException的時候纔會回滾,加上rollbackFor=Exception.class,可以讓事物在遇到非運行時異常時也回滾。