MySQL--事務隔離級別及傳播機制


TRANSACTION(事務隔離級別)

在說明事務隔離級別之前先說一下臟讀不可重復讀幻讀這三個概念。

臟讀:一個事務讀取到另一事務未提交的更新新據。當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務也訪問這個數據,然后使用了這個數據。因為這個數據是還沒有提交的數據, 那么另外一個事務讀到的這個數據是臟數據,依據臟數據所做的操作也可能是不正確的。

不可重復讀:在同一事務中,多次讀取同一數據返回的結果有所不同。換句話說就是,后續讀取可以讀到另一事務已提交的更新數據。相反,“可重復讀”在同一事務中多次讀取數據時,能夠保證所讀數據一樣,也就是,后續讀取不能讀到另一事務已提交的更新數據。

幻讀:事務T1執行一次查詢,然后事務T2新插入一行記錄,這行記錄恰好可以滿足T1所使用的查詢的條件。然后T1又使用相同的查詢再次對表進行檢索,但是此時卻看到了事務T2剛才插入的新行。這個新行就稱為“幻像”,因為對T1來說這一行就像突然出現的一樣。

 

1. ISOLATION_DEFAULT:這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別。每種數據庫的默認隔離級別是不同的,例如SQL Server、Oracle默認Read Commited,MySQL默認Repeatable Read。
另外四個與JDBC的隔離級別相對應,不同的隔離級別采用不同的鎖類型來實現,在四種隔離級別中,Serializable的隔離級別最高,Read Uncommited的隔離級別最低。

2. ISOLATION_READ_UNCOMMITTED(讀取未提交):讀未提交數據,這是事務最低的隔離級別,在並發的事務中,它充許一個事務可以讀到另一個事務未提交的更新數據。(會出現臟讀,不可重復讀和幻讀)

3. ISOLATION_READ_COMMITTED(讀已提交):讀已提交數據,保證在並發的事務中,一個事務修改的數據提交后才能被另外一個事務讀取到。(會出現不可重復讀和幻讀)

4. ISOLATION_REPEATABLE_READ(可重復讀):可重復讀,這種事務隔離級別可以防止臟讀,不可重復讀。但是可能出現幻讀。一般是采用“快照”的方式來實現的。

5. ISOLATION_SERIALIZABLE(可串行化):事務被處理為順序執行。這是花費最高,但也是最可靠的事務隔離級別。能有效的避免臟讀、不可重復讀、幻讀。

 

數據庫事務的4個特性:
原子性(Atomic):組成一個事務的多個數據庫操作是一個不可分割的原子單元;只有所有操作執行成功,整個事務才提交,
其中一個操作失敗,都必須回滾到初始狀態。
一致性(Consistency):事務操作成功后數據庫所處的狀態和它的業務規則是一致的;(即數據總額不會被破壞。
如A賬戶轉賬100到B賬戶,無論操作成功與否,A和B的存款總額是不變的)
隔離性(Isolation):在並發數據操作時,不同的事務擁有各自的數據空間,它們的操作不會對彼此產生干擾。(並非是完全無干擾,
根據數據庫的隔離級別,會產生不同程度的干擾)
持久性(Durability):一旦事務提交成功,事務中的數據操作都必須持久化到數據庫中;就算數據庫崩潰,也必須保證有某種機制恢復。

在這些特性中,數據“一致性”是最終目標,其他的特性都是為了達到這個目標的措施和手段。

MYSQL查看當前事務隔離級別

select  @@tx_isolation,@@global.tx_isolation;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM