事務的隔離級別
事務的隔離級別源於事務ACID的I(Isolation),即多個事務同時操作同一實體時,其中一個事務的讀寫操作對其他事務及其自身的可見性影響程度。具體可以分爲如下幾個等級:
-
讀未提交
某個事務未提交前,其修改的數據對其他事務可見,這種隔離級別最低,除了確保執行事務本身的原子性,對其他事務幾乎無隔離,所以如果源事務回滾,其他事務就會出現髒讀現象。 -
讀已提交
一個事務針對數據的寫操作,只有提交之後,其他事務纔可見。這是相對靠譜的方案。也是很多數據庫的默認隔離級別。讀提交也存在兩個主要的問題,第一種是,如果兩個事務同時開啓,其中一個事務第一次讀取,和在另一個事務修改並提交後讀取到的數據會不一致,也就是不可重複讀;第二個問題是,容易引起死鎖。 -
可重複讀
一個事務針對數據的讀操作一旦開始,其他事務不再可以進行寫操作,相當於讀鎖。可重複讀增加了數據的安全性,但是針對新增操作,依然存在幻讀問題。 - 串行化
串行化是安全性最高的一種隔離界別,也是用的最少的一種隔離級別,事務串行化執行,吞吐量嚴重受限。
事務的傳播級別
和事務的隔離級別不同,傳播特性是指一個事務開啓後,如果在事務內涉及到其他事務的調用,是沿用主事務,還是開啓新事務,亦或是,不接受事務。
- REQUIRED 如果存在一個事務,支持當前事務。如果沒有則開啓一個新的事務。
- SUPPORTS 如果存在一個事務,支持當前事務。如果沒有則按照非事務的執行。
- MANDATORY 如果已經存在一個事務,支持當前事務。如果沒有則拋出異常。
- REQUIRES_NEW 總是開啓一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。
- NOT_SUPPORTED 總是按照非事務地執行,並掛起任何存在的事務。
- NEVER 總是按照非事務方式執行,如果存在一個活動事務則拋出異常
- NESTED 如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按REQUIRED 屬性執行。
NESTED傳播級別時,如果外層事務不可回滾內存提交的事務。