天天看點

sqlserver 資料庫排它鎖_mysql事務和鎖相關概述

一:事務的四大特性(ACID)

1.原子性:不可分割,要麼全部執行,要麼全部失敗復原,失敗復原後,資料庫的狀态與改事務執行之前的資料庫狀态相同。不存在中間狀态(部分成功或部分失敗)

注意:在事務執行過程中是存在

部分成功狀态

的,隻是當在後續的執行過程中,倘若遇到了

失敗狀态

,那麼之前的

部分成功狀态将被復原

,導緻整個事務被復原

例:A有500,B有200 A轉賬B 300。 最終的結果隻有兩個 要麼轉賬成功,

A剩200,B變500 ,

要麼轉賬失敗,A,B餘額都不變

2.一緻性:在事務執行前後,整個資料庫處于一緻狀态,保持資料的完整性。即事務執行的結果必須是使資料庫從一個一緻性狀态變到另一個一緻性狀态。

3.隔離性:即在事務存在并發的情況下,每個事務之間感覺不到對方的存在,互不幹擾。

4.持久性:務送出以後,資料是永久儲存在系統(資料庫)中的,即使發生斷電等故障

二:事物的隔離級别

1.讀未送出(Read Uncommitted) :又被稱為髒讀,即一個事務讀到另一個事務還沒有送出的資料;可能出現的問題有髒讀、不可重複讀、幻讀

sqlserver 資料庫排它鎖_mysql事務和鎖相關概述

2.讀已送出(Read Committed) : 又稱不可重複讀,即一個事務讀到了另一個事務已經送出的資料。為Oracle、Sql Server等資料庫的預設隔離級别,可能出現的問題有不可重複讀、幻讀。

sqlserver 資料庫排它鎖_mysql事務和鎖相關概述

3:可重複讀(Repeated Read) :又稱幻讀,Mysql預設的隔離級别,幻讀是事務非獨立執行時發生的一種現象。例如事務T1讀取一條指定where條件的語句,傳回結果集。此時事務T2插入一行新記錄,恰好滿足T1的where條件。然後T1使用相同的條件再次查詢,結果集中可以看到T2插入的記錄,這條新紀錄就是幻讀。 幻讀和不可重複讀都是讀取了另一條已經送出的事務(這點就髒讀不同),所不同的是不可重複讀查詢的都是同一個資料項,而幻讀針對的是一批資料整體(比如資料的個數)。可能出現的問題幻讀。

sqlserver 資料庫排它鎖_mysql事務和鎖相關概述

4:串行化(Serializable):MySQL資料庫中隔離級别最高、最嚴格,避免了髒讀、不可重複讀、幻讀的發生,但相應的,對資料庫的性能會造成一定的影響

三:資料庫鎖(事務鎖)

1.鎖是為了解決什麼問題

鎖在資料庫中其功能之一也是用來實作事務隔離性。而事務的隔離性其實是用來解決髒讀,不可重複讀,幻讀幾類問題

2.mysql鎖分類

sqlserver 資料庫排它鎖_mysql事務和鎖相關概述

3.

A---模式分類

(1)悲傷鎖

悲觀鎖是基于一種悲觀的态度類來防止一切資料沖突,它是以一種預防的姿态在修改資料之前把資料鎖住,然後再對資料進行讀寫。在它釋放鎖之前任何人都不能對其資料進行操作,直到前面一個人把鎖釋放後下一個人資料加鎖才可對資料進行加鎖,然後才可以對資料進行操作。悲觀鎖認為在操作資料時會出現資料沖突,每次都要通過擷取鎖才能對相同資料進行操作,是以悲觀鎖需要耗費較多的時間。共享鎖和排它鎖是悲觀鎖的不同實作,都屬于悲觀鎖的範疇。

(2)樂觀鎖

樂觀鎖是對于資料沖突保持一種樂觀态度,操作資料時不會對操作的資料進行加鎖(這使得多個任務可以并行的對資料進行操作),隻有到資料送出的時候才通過一種機制來驗證資料是否存在沖突。

樂觀鎖最常用的實作方式是用資料版本(Version)記錄機制。資料版本即為資料增加一個版本辨別,一般通過在資料庫表中增加一個數字類型的 “version” 字段實作。讀取資料時将version字段值一同讀出,資料每更新一次,對version值加1,送出更新時将資料庫表對應記錄的目前version值與已取出的version值進行比對,如果資料庫表目前version值與已取出的version值相等,則可以更新,否則認為是過期資料。

通常在實際項目中涉及金錢類的可能會使用這種樂觀鎖。

B---範圍類

(3)表鎖

表鎖是指上鎖的時候鎖住的是整個表,當下一個請求通路該表的時候,必須等前一個請求釋放了所才能進行對表進行通路;

(4)行鎖

行鎖是指上鎖的時候鎖住的是表的某一行或者多行記錄,其他請求通路同一張表時,隻有被鎖住的記錄不能通路,其他的記錄可正常通路;

C---算法類

(1)記錄鎖

記錄鎖是在索引記錄上的鎖。例如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;防止任何其他事務 插入、更新 或 删除 t.c1=10 的行。

(2)間隙鎖

間隙鎖(gap)是索引記錄之間上的鎖,或者說第一個索引記錄之前或最後一個索引記錄之後的間隔上的鎖。例如,SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;阻止其他事務插入t.c1 = 15的記錄,不管是否已經有這種值在本列中,因為這個範圍内的所有值都被上鎖了

(3)臨鍵鎖

NK鎖是記錄鎖和間隙鎖的組合,鎖定一個範圍,并且鎖定記錄本身。對查詢範圍進行加鎖,在另一個事務執行插入操作時是不被運作的,進而避免了幻讀。用于解決幻讀問題。InnoDB預設的事務隔離級别是Repeatable Read,此時InnoDB使用NK鎖進行搜尋和索引掃描,防止産生幻讀。

D---屬性類

(1)共享鎖

共享鎖又稱讀鎖,簡稱S鎖;當一個事務為資料加上讀鎖之後,其他事務隻能對該資料加讀鎖,而不能對資料加寫鎖,直到所有的讀鎖釋放之後其他事務才能對其進行加持寫鎖。

(2)排它鎖

排他鎖又稱寫鎖,簡稱X鎖;當一個事務為資料加上寫鎖時,其他請求将不能再為資料加任何鎖,直到該鎖釋放之後,其他事務才能對資料進行加鎖

sqlserver 資料庫排它鎖_mysql事務和鎖相關概述

E-----狀态鎖

意向鎖是一種允許行鎖與表鎖共存的表鎖。意向鎖是由資料庫引擎維護的,使用者無法手動操作。在為資料行加 共享鎖 / 排它鎖 之前,InooDB 會先擷取該資料行所在資料表的對應 意向鎖。意向鎖隻會阻塞全表請求,主要目的是展示正在鎖定表中一行,或者将要鎖定一行。

(1)意向共享鎖

事務有意向對表中的某些行加共享鎖(S鎖)

(2) 意向排它鎖

事務有意向對表中的某些行加排它鎖(X鎖)