資料庫 事務級別介紹
資料庫 事務級別介紹
2個概念:事務,鎖。
事務:邏輯單元內的一系列操作,要麼全部完成執行,要麼全部不執行。
鎖:將某資料的操作加鎖,則其他人無法獲取當前資料的當前操作。避免單位時間內的資料覆蓋,影響資料的一致性。
事務是多個操作的執行邏輯與的集合。事務內控制加鎖,實現不同的級別。事務內的鎖,需等事務結束才能釋放鎖。不加事務的鎖,操作完即釋放鎖。
三操作:
讀,rade -R
寫,write -W
增,add -A
鎖分類:鎖住操作,避免其他人獲取。
寫操作枷鎖 排它鎖 X 鎖
讀操作加鎖 共享鎖 S 鎖。
(X鎖與S鎖無法共存,一個數據即只能取一種鎖)
事務級別:
Read Uncommitted –1個事務,1個X鎖,即對寫資料枷鎖。讀無鎖。
對寫枷鎖,避免了資料的覆蓋,丟失。但是事務內可讀,存在讀取未提交或回滾的資料,出現髒資料。 該級別是資料庫最低級別。
Read Committed –1個事務,2個鎖。事務內X鎖。
讀寫的枷鎖,避免了資料丟失與髒資料。若是在多資料單元處理時,一條記錄加事務,未加事務的記錄,因可做寫操作,不能重複讀。否則資料前後讀取不一致。
Repeatable read —2個事務,2個鎖。
避免了資料的丟失,髒,以及不可重複讀情況。但是在事務內操作的情況下,資料庫增加記錄不可控,即會出現符合是事務內搜尋條件的記錄,但是不新增進事務。事務執行完,即有滿足條件為修改的資料,為幻讀。
Serializable 序列化。即不可並行操作資料庫。
避免上述問題,但是影響資料庫的效率。
延伸:MVCC 多版本控制—multi-Version current control
MySql資料庫中實現
讀操作不加鎖情況下實現可重複讀。
對資料庫記錄增加 事務ID 與回滾指正欄位
。
事務ID 遞增。
每次讀取操作是,增加一個 read view 的資料結構,控制資料的版本資訊。
read view 中包含 當前事務列表,Tmin Tmax .
通過事務ID 來實現資料的可見性。只有在上次提交後 本次事務前的資料記錄可見。即事務內的一次讀取的資料在被修改後,二次讀取的還是事務前的記錄資料。
詳情見 劉欣 碼農翻身公眾號 資料庫旺財與小強。