mysql筆記 鎖介紹

2022-04-05 11:32:31 字數 2633 閱讀 7751

學習資料:關於mysql核心,一定要知道的!

併發控制保證資料一致性的方法:

(1)鎖:

普通鎖:序列執行

讀寫鎖:讀讀併發

(2)資料多版本: 讀寫併發

(1)寫任務發生時,將資料轉殖乙份,以版本號區別 ;

(2)寫任務操作新轉殖的資料,直至提交

(3)併發讀任務可以繼續讀舊版本的資料,不至於阻塞

實現讀取舊版本資料:

redo日誌:redo日誌儲存已提交的資料,用於保障已提交資料的acid特性。

1.當資料庫對資料做修改的時候,需要把資料頁從磁碟讀到buffer pool中,然後在buffer pool中進行修改,那麼這個時候buffer pool中的資料頁就與磁碟上的資料頁內容不一致,稱buffer pool的資料頁為dirty page 髒資料,如果這個時候發生非正常的db服務重啟,那麼這些資料還沒在記憶體,並沒有同步到磁碟檔案中(注意,同步到磁碟檔案是個隨機io),也就是會發生資料丟失。把相應修改記錄記錄到redo檔案中(順序io),恢復db時,根據redo檔案的記錄內容,重新刷到磁碟檔案上,資料保持一致。

2.如果每次都將事務提交的資料更新隨機寫到磁碟上,效能較低。優化:將修改資料順序寫到redo日誌裡,定期刷到磁碟上。

undo日誌:undo日誌存放資料被修改前的值,保障未提交資料對資料庫acid特性產生影響。

事務未提交前,將修改資料的映象(修改前的舊版本),當事務回滾或者資料庫崩潰時,恢復舊版本。

insert行為undo日誌存pk,update/delete行為undo日誌存row。分別存在不同的buffer裡。

回滾段:儲存undo日誌

innordb如何做到高併發:innordb是基於多版本併發控制(mvcc)的儲存引擎

回滾段裡的資料是歷史資料的快照,快照讀(不加鎖一致性讀)是innordb如此高併發的原因。

普通的select都是快照讀,除非顯示加鎖,如select .. fro update 。

快照讀讀取到的資料版本與什麼有關?

rc(讀提交)下,快照讀總是讀取到最新的行資料快照(已提交的事務)

rr(可重複讀)下,讀取首次read的資料版本,與併發事務的開始時間、互斥關係(不加鎖)無關。假設首次read的時間記為t,不會讀取t時間後提交的記錄。

1) 自增鎖:

是特殊的表級別鎖,針對事務插入auto_increment列。如果乙個事務在插入,其他事務必須等待。

2)共享/排它鎖

共享鎖s:讀鎖

排它鎖x:寫鎖。很強的鎖,不與其它鎖相容。

讀讀可以並行,讀寫、寫寫互斥。

3)意向鎖

意向鎖是在事務要加共享/排它鎖之前先做的乙個意向宣告。是乙個表級別的鎖。

意向共享鎖is:事務有意向向表中某些行加共享s鎖

意向排它鎖is:事務有意向向表中某些行加排它x鎖

4)插入意向鎖

專門針對insert操作。多個事務,在同乙個索引,同乙個範圍,如果插入位置不衝突,不會阻塞彼此。

5)記錄鎖

封鎖索引記錄。比如:select ... for update

6)間隙鎖

封鎖索引記錄的間隔。防止其他事務在間隔中插入資料。比如:select .. betweend ... and .. for update

7) 臨鍵鎖

封鎖索引記錄和索引區間。防止幻讀。

樂觀鎖和悲觀鎖。樂觀鎖使用版本號,悲觀鎖是一直等待;

表鎖:lock table 

行鎖:begin 開啟事務

sqlcommit 提交事務

1)四個特性:

a原子性:事務裡所有操作要麼全部都執行,要麼全不執行

c一致性:所有操作全部成功或全部失敗

i隔離性:事務中間處理過程對外不可見

d永久性:資料修改是永久的

2)併發事務帶來的問題:

更新丟失:樂觀鎖使用版本號,低版本的更新會丟棄

髒讀:事務a讀到了事務b修改但未提交的內容

不可重複讀:事務a讀到事務b修改已提交的內容。舉例:事務a第一次來查詢,做了後續的業務處理,事務b進行資料修改的提交,事務a再次來查詢,此時資料的修改可能會影響事務a的業務邏輯判斷。

幻讀:事務a讀到了事務b提交的更新資料。舉例:事務a第一次查詢只有三條資料需要修改,事務b進行新增資料的提交,最終更新了四條資料。

3)事務隔離級別:mysql預設的隔離級別是repeated read(rr)可重複讀

檢視事務隔離級別:show variables like 'tx_isolation' 

隔離級別

髒讀不可重複讀

幻讀讀未提交是是

是讀已提交否是

是可重複讀否否

是可序列化否否

否可重複讀的mvcc機制:

select操作不會更新版本號,是快照讀(歷史版本)

insert、update、delete 會更新版本號,可查詢到其他事務提交的修改(即會出現幻讀)

4)優化建議:

1.盡可能讓所有資料檢索通過索引完成,避免無索引行鎖公升級為表鎖

2.盡可能檢索條件避免間隙鎖

3.盡可能控制事務大小,減少鎖定資源量和時間長度

4.盡可能低級別事務隔離

各種sql加了什麼鎖

MySQL學習筆記 鎖

macbook pro mysql技術內幕innodb儲存引擎 第二版 資料庫中最大的難點 一方面需要最大程度地利用資料庫的併發訪問,另外一方面還要確保每個使用者能以一致的方式讀取和修改資料。因此就有了鎖的機制。q innodb儲存引擎為什麼乙個鎖和多個鎖的開銷是相同。a lock的物件是事務,用來...

Mysql之鎖的基本介紹

資料庫鎖定機制簡單來說,就是資料庫為了保證資料的一致性,而使各種共享資源在被併發訪問變得有序所設計的一種規則。對於任何一種資料庫來說都需要有相應的鎖定機制,所以mysql自然也不能例外。mysql資料庫由於其自身架構的特點,存在多種資料儲存引擎,每種儲存引擎所針對的應用場景特點都不太一樣,為了滿足各...

MySQL表鎖,行鎖,事務隔離級別介紹

myisam支援表鎖,不支援事務,支援全文索引,預設表型別.innodb支援行鎖,支援事務,不支援全文索引 但可以用sphinx分詞索引 行鎖級 share lock 別名 讀鎖,共享鎖,意向鎖 exclusivelock 別名 寫鎖,排他鎖 表鎖級 myisam 表共享讀鎖 table read ...