1. 程式人生 > >MySQL事務個人理解

MySQL事務個人理解

事務特性

原子性(Atomicity)
原子是不可分割的,表示一個事務的全部操作只能全部都完成,或全部都不完成(回滾)。

一致性(Consistency)
在事務開始前與結束後,資料庫的資料是一致的;從舊一致性狀態到新一致性狀態。

隔離性(Isolation)
兩個事務通過鎖來進行隔離,獨立相互不干擾。

永續性(Durability)
事務提交或回滾後,資料都被落地到磁碟的資料庫檔案中,宕機都是存在的。

ACID要記得它們的英文全名。

事務隔離級別

未提交讀(Read Uncommitted)
AB兩個事務之間,B事務尚未提交,但是A事務就可以獲取到B修改的內容,這種情況下就可能造成“髒讀”

(如果B事務回滾了,那當前A事務獲取到的就是髒資料)。

提交讀(Read Committed)
AB兩個事務之間,如果A事務操作時間長,在開始時讀取了某一行資料,然後B事務把該行資料作修改並提交了;當A事務再次去獲取這一行資料,與之前的就不一樣了。這就是“不可重複讀”

可重複讀(Repeatable Read)
保證不會出現上一個級別的問題,但有可能出現“幻讀”。例如AB事務,A事務去獲取連續的多行資料,然後B事務在這幾行資料之間插入了新的一行,當A再次去讀取的時候,出現了虛幻資料。

序列化(Serializable)
這種的隔離級別只允許事務一個接著一個去執行,保證沒有兩個事務並行的情況,絕不會出現上面的問題。

但是這樣的概念性,很虛吧,這到底是什麼鬼?
後來瞭解到排它鎖(寫鎖、X鎖)共享鎖(讀鎖、S鎖)後,經過一段時間的思考,個人的理解是如下:
讀讀共享,讀寫、寫寫互斥。謹記!!!

對於 Read Uncommitted ,讀鎖寫鎖都是瞬時的(操作完就釋放),可造成“髒讀”

對於 Read Committed ,寫鎖持有到事務結束,解決“髒讀”,但是讀鎖是瞬時的,可造成“不可重複讀”

對於 Repeatable Read ,讀鎖、寫鎖持有到事務結束,解決“不可重複讀”,行級鎖限制不了行之間的插入新資料行,可造成“幻讀”

Serializable 或許是比表級鎖更大的“資料庫鎖”(不知道是啥)吧!保證整個資料庫只有一個執行事務。

MySQL 的 InnoDB 引擎預設是 Repeatable Read 這個隔離級別,有一個機制解決“幻讀”,就是間隙鎖,封鎖了行之間的間隙。
個人理解僅限於此。還有一個可以去理解的機制MVCC