mysql innodb 排他锁_MySQL 针对 InnoDB 引擎锁的种类:行锁(共享锁和排他锁)和表锁(意向共享锁和意向排他锁)...
InnoDB 鎖快速到底
行鎖:共享鎖(S)、排他鎖(X)
表鎖:意向共享鎖(IS)、意向排他鎖(IX)
下面主要針對 MySQL 中行級鎖中的共享鎖(S)與排他鎖(X)進(jìn)行分析
共享鎖又稱為讀鎖,簡稱 S 鎖,顧名思義,共享鎖就是多個事務(wù)對于同一數(shù)據(jù)可以共享一把鎖,都能訪問到數(shù)據(jù),但是只能讀不能修改。
排他鎖又稱為寫鎖,簡稱X鎖,顧名思義,排他鎖就是不能與其他所并存,如一個事務(wù)獲取了一個數(shù)據(jù)行的排他鎖,其他事務(wù)就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務(wù)是可以對數(shù)據(jù)就行讀取和修改。
對于共享鎖大家可能很好理解,就是多個事務(wù)只能讀數(shù)據(jù)不能寫數(shù)據(jù),對于排他鎖大家的理解可能就有些差別,我當(dāng)初就犯了一個錯誤,以為排他鎖鎖住一行數(shù)據(jù)后,其他事務(wù)就不能讀和寫該行數(shù)據(jù),其實不是這樣的。排他鎖指的是一個事務(wù)在一行數(shù)據(jù)加上排他鎖后,其他事務(wù)不能再在其上加其他的鎖。MySQL InnoDB 引擎默認(rèn)的修改數(shù)據(jù)語句,update,delete,insert都會自動給涉及到的數(shù)據(jù)加上排他鎖,select 語句默認(rèn)不會加任何鎖類型,如果加排他鎖可以使用 select ...for update 語句,加共享鎖可以使用 select ... lock in share mode 語句。所以加過排他鎖的數(shù)據(jù)行在其他事務(wù)種是不能寫數(shù)據(jù)(因為寫數(shù)據(jù)是需要加排他鎖的,同一數(shù)據(jù)是不能夠在加排他鎖之后還進(jìn)行加鎖的,哪怕是共享鎖也不行)的,也不能通過 for update 和 lock in share mode 鎖的方式讀數(shù)據(jù),但可以直接通過 select ...from... 查詢數(shù)據(jù),因為普通查詢不會加任何鎖。
說了這么多,咱們來看下以下簡單的例子:
測試數(shù)據(jù):
1、現(xiàn)在我們對 id=1 的數(shù)據(jù)行?排他查詢,這里會使用 begin(或 start transaction)開啟事務(wù),而不會看見我關(guān)閉事務(wù),這樣做是用來測試,因為?提交事務(wù)或回滾事務(wù)就會釋放鎖。
(1) 打開一個查詢窗口進(jìn)行查詢會查詢到一條數(shù)據(jù)
(2)現(xiàn)在打開另一個查詢窗口,對同一數(shù)據(jù)分別使用排他查和共享查和普通查詢?nèi)N方式查詢
排他查
共享查
普通查詢
結(jié)果是無論是排他鎖查詢還是共享鎖查詢都會處于阻塞狀態(tài),因為 id=1 的數(shù)據(jù)已經(jīng)被加上了排他鎖,此處阻塞是等待排他鎖釋放。但是普通查詢是可以查到數(shù)據(jù)的
2、現(xiàn)在我們對 id=1 的數(shù)據(jù)行?共享查詢
(1)打開另一個查詢窗口,對同一數(shù)據(jù)分別使用排他查和共享查和普通查詢?nèi)N方式查詢
排他查
共享查
普通查詢
我們看到是可以普通查詢和加共享鎖都是可以查詢到數(shù)據(jù),但加排他鎖就查不到,因為排他鎖與共享鎖不能作用于同一聚簇索引上(其實鎖是加在索引上的,而不是那條記錄上,下一篇博客上會解釋)。
mysql InnoDb 引擎中 update,delete,insert 語句自動加排他鎖
首先進(jìn)行 update
此時進(jìn)行對正在 update 的索引加共享鎖進(jìn)行查詢
會發(fā)現(xiàn)此時共享查詢處于阻塞,等待排它鎖的釋放。
接下來看一下使用普通查詢
但是用普通查詢能查到數(shù)據(jù),因為沒用上鎖機(jī)制不與排他鎖互斥,但查到的數(shù)據(jù)是修改數(shù)據(jù)之前的老數(shù)據(jù)。
然后我們提交數(shù)據(jù),釋放排他鎖看下修改后的數(shù)據(jù),此時可用排他查,共享查和普通查詢, 因為事務(wù)提交后排他鎖釋放。下面就簡單演示一下普通查詢:
1、先提交數(shù)據(jù)
2、再進(jìn)行普通查詢
可以看到結(jié)果與預(yù)期的一樣。
以上為我對 mysql 中共享鎖與排他鎖的個人理解。
總結(jié)
以上是生活随笔為你收集整理的mysql innodb 排他锁_MySQL 针对 InnoDB 引擎锁的种类:行锁(共享锁和排他锁)和表锁(意向共享锁和意向排他锁)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟机中mysql-cobar安装_co
- 下一篇: 美国不想还欠中国的钱了?特朗普最清楚该不