mysql 鎖的架構 總結Mysql中的鎖

2021-10-18 20:12:43 字數 3001 閱讀 1680

mysql中的鎖

概述myisam支援表鎖,innodb支援表鎖和行鎖,預設為行鎖

表級鎖:開銷小,加鎖快,不會出現死鎖。鎖定粒度大,發生鎖衝突的概率最高,併發量最低

行級鎖:開銷大,加鎖慢,會出現死鎖。鎖力度小,發生鎖衝突的概率小,併發度最高

myisam表級鎖

鎖模式show status like 『table%』 可以分析鎖爭奪情況

表級鎖分為兩種模式:共享讀鎖,獨佔寫鎖

讀讀共享,讀寫互斥,寫寫互斥,寫讀互斥(比如寫讀互斥,當乙個使用者對user表進行寫的時候,會阻塞其他使用者的寫操作和讀操作)

加表鎖在select的時候自動加讀鎖,在update delete insert時,自動加寫鎖

一般不需要使用者用lock table 命令直接顯式加鎖

顯示加表鎖時

session1顯示給user表加鎖

lock table user read;

session1此時不能讀取未鎖定的class表,所以lock table時要一次性鎖定要用到的表

session1此時不能進行更新和插入,只能進行讀取

其他session可以讀取user表,但是更新會阻塞,而插入不會阻塞(可以通過設定concurrent_insert 系統變數來控制併發插入行為)

鎖排程當乙個程序請求user表的讀鎖,乙個程序請求user表的寫鎖,即使讀請求先到,也是請求寫鎖成先成功

所以,myisam不適合大量的更新,因為大量更新會導致查操作很難獲得讀鎖

innodb行級鎖

行鎖通過 show status like 『innodb_row_lock』 來分析行鎖爭奪情況

共享鎖s:允許乙個事務去讀一行,阻止其他事務獲得相同資料集的排他鎖

排他鎖x:允許獲得排它鎖的事務更新資料,阻止其他事務取得相同資料集的共享鎖和排他鎖

意向鎖所謂意向鎖就是意圖拿到鎖,所以要獲得共享鎖時,需要先獲得意向共享鎖

意向共享所is,乙個事務給乙個資料行加共享鎖時,必須先獲得表的is鎖

意向排它鎖ix,乙個事務給乙個資料行加排他鎖時,必須先獲得該錶的ix鎖

間隙鎖範圍查詢時,比如select * from user where id>50 ,這個時候即使最大id為51,不僅會給符合條件的行加鎖,也會給id大於51(不存在的記錄)的加鎖,這就是間隙鎖

間隙鎖解決了事務併發的幻讀問題

相容情況鎖s

xisixs

yesno

yesnoxno

nono

nois

yesno

yesyes

ixno

noyes

yes加鎖

意向鎖是innodb自動加的

對於update insert delete 會自動加排它鎖

對於select不會自動加鎖

select * from user lock in share mode 手動新增共享鎖

select * from user for update 手動新增排它鎖

行鎖使用方式

通過索引條件檢索資料時,才使用行鎖,否則用表鎖

也就是如果select的where列不是索引列,那麼此時,實際上是給整個表加鎖

檢索條件是索引時,又分索引是聚集索引還是非聚集索引,如果是聚集索引(索引上葉節點存放的整條記錄),在聚集索引上的加上行鎖,而如果是非聚集索引,要在非聚集索引記錄上加行鎖,又要在聚集索引上加行鎖

什麼時候使用表鎖

事務需要更新表的大部分資料。如果每一行都加上排他鎖,鎖衝突嚴重,那麼此時執行效率低

事務涉及多個表,比較複雜

死鎖myisam

由於加的是表鎖,一次性鎖定要需要的表,所以不會出現死鎖

innodb

死鎖一般是事務相互等待對方資源

發生死鎖後,會自動檢測,並讓乙個事務釋放鎖並回退

session1

session2

update user set username=』jiajun』 where id=1

update user set username=』jiajun』 where id=2

update user set username=』jiajun』 where id=2

update user set username=』jiajun』 where id=1

上面就是死鎖的列子

樂觀鎖與悲觀鎖

樂觀鎖和悲觀鎖是一種思想,不是上面提到的資料庫提供的鎖,是併發控制的一種手段

有這樣的場景,兩個事務對商品(id=666)進行下單

樂觀鎖有乙個statu欄位,未下單為0,下單為1

先查statu欄位,下單進行更新, 再查詢一次statu看是否與之前查的一樣,一樣的話commit,不一樣的話rollback

實現方式:加乙個版本號或者時間戳,提交前進行一次比較

悲觀鎖直接對id為666的行加排他鎖

實現方式:通過資料庫的鎖機制進行加鎖

對比悲觀鎖比較謹慎,採用加鎖機制,一定程度下降低了併發性

樂觀鎖認為一般情況下不會發生衝突,併發性較好

從衝突量和重試代價來衡量,如果衝突很少,或者重試代價不會很嚴重,那麼通常情況下應該選擇樂觀鎖,因為它能得到更好的併發性,而且更容易實現。但是,如果衝突的代價嚴重,那麼就需要使用悲觀策略

兩段鎖原則

兩段鎖是乙個加鎖原則,一種協議

鎖操作分為兩個階段,加鎖階段只加鎖不放鎖,解鎖階段只放鎖不加鎖

比如乙個事務中兩個update語句,此時執行完第乙個update不會立刻放鎖,等加鎖階段完成後再進行放鎖,也就是加鎖和解鎖不相交

事務開始後就處於加鎖階段,一直到執行rollback和commit之前都是加鎖階段。rollback和commit使事務進入解鎖階段,即在rollback和commit模組中dbms釋放所有封鎖。

我覺得分享是一種精神,分享是我的樂趣所在,不是說我覺得我講得一定是對的,我講得可能很多是不對的,但是我希望我講的東西是我人生的體驗和思考,是給很多人反思,也許給你一秒鐘、半秒鐘,哪怕說一句話有點道理,引發自己內心的感觸,這就是我最大的價值。(這是我喜歡的一句話,也是我寫部落格的初衷)

mysql安裝總結 mysq安裝總結 MySQL

2 建立mysql安裝使用者 直接檢視install binary檔案當中有建立使用者的語句。語句為groupadd mysql useradd r g mysql mysql 3 為前面解壓的目錄在 usr local 下建立乙個軟連線,並且附許可權。cd usr local ln s opt m...

mysql鎖機制總結 mysql鎖機制總結

1.隔離級別 1 讀不提交 read uncommited,ru 這種隔離級別下,事務間完全不隔離,會產生髒讀,可以讀取未提交的記錄,實際情況下不會使用。2 讀提交 read commited,rc 僅能讀取到已提交的記錄,這種隔離級別下,會存在幻讀現象,所謂幻讀是指在同乙個事務中,多次執行同乙個查...

mysql鎖的總結(個人)

lock table test read 當前會話 可查詢test,不能增刪改test,出現table test was locked with a read lock and can t be updated 不能查增刪改 其他表,出現table a was not locked with loc...