學習資料:關於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 ...