mysql的共享鎖與排他鎖的區(qū)別和使用方法

MySQL鎖機(jī)制分為表級(jí)鎖和行級(jí)鎖,本文就和大家分享一下我對mysql中行級(jí)鎖中的共享鎖與排他鎖進(jìn)行分享交流。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序設(shè)計(jì)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了安新免費(fèi)建站歡迎大家使用!

共享鎖又稱為讀鎖,簡稱S鎖,顧名思義,共享鎖就是多個(gè)事務(wù)對于同一數(shù)據(jù)可以共享一把鎖,都能訪問到數(shù)據(jù),但是只能讀不能修改。

排他鎖又稱為寫鎖,簡稱X鎖,顧名思義,排他鎖就是不能與其他所并存,如一個(gè)事務(wù)獲取了一個(gè)數(shù)據(jù)行的排他鎖,其他事務(wù)就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務(wù)是可以對數(shù)據(jù)就行讀取和修改。

對于共享鎖大家可能很好理解,就是多個(gè)事務(wù)只能讀數(shù)據(jù)不能改數(shù)據(jù),對于排他鎖大家的理解可能就有些差別,我當(dāng)初就犯了一個(gè)錯(cuò)誤,以為排他鎖鎖住一行數(shù)據(jù)后,其他事務(wù)就不能讀取和修改該行數(shù)據(jù),其實(shí)不是這樣的。排他鎖指的是一個(gè)事務(wù)在一行數(shù)據(jù)加上排他鎖后,其他事務(wù)不能再在其上加其他的鎖。mysql InnoDB引擎默認(rèn)的修改數(shù)據(jù)語句,update,delete,insert都會(huì)自動(dòng)給涉及到的數(shù)據(jù)加上排他鎖,select語句默認(rèn)不會(huì)加任何鎖類型,如果加排他鎖可以使用select ...for update語句,加共享鎖可以使用select ... lock in share mode語句。所以加過排他鎖的數(shù)據(jù)行在其他事務(wù)種是不能修改數(shù)據(jù)的,也不能通過for update和lock in share mode鎖的方式查詢數(shù)據(jù),但可以直接通過select ...from...查詢數(shù)據(jù),因?yàn)槠胀ú樵儧]有任何鎖機(jī)制。

說了這么多,咱們來看下以下簡單的例子:

我們有如下測試數(shù)據(jù)

mysql的共享鎖與排他鎖的區(qū)別和使用方法

現(xiàn)在我們對id=1的數(shù)據(jù)行排他查詢,這里會(huì)使用begin開啟事務(wù),而不會(huì)看見我關(guān)閉事務(wù),這樣做是用來測試,因?yàn)樘峤皇聞?wù)或回滾事務(wù)就會(huì)釋放鎖。

打開一個(gè)查詢窗口

mysql的共享鎖與排他鎖的區(qū)別和使用方法

會(huì)查詢到一條數(shù)據(jù),現(xiàn)在打開另一個(gè)查詢窗口,對同一數(shù)據(jù)分別使用排他查和共享鎖查詢兩種方式查詢

排他查

mysql的共享鎖與排他鎖的區(qū)別和使用方法

共享查

mysql的共享鎖與排他鎖的區(qū)別和使用方法

我們看到開了排他鎖查詢和共享鎖查詢都會(huì)處于阻塞狀態(tài),因?yàn)閕d=1的數(shù)據(jù)已經(jīng)被加上了排他鎖,此處阻塞是等待排他鎖釋放。

如果我們直接使用以下查詢呢

mysql的共享鎖與排他鎖的區(qū)別和使用方法

我們看到是可以查詢到數(shù)據(jù)的。

我們再看一下一個(gè)事務(wù)獲取了共享鎖,在其他查詢中也只能加共享鎖或不加鎖。

mysql的共享鎖與排他鎖的區(qū)別和使用方法

mysql的共享鎖與排他鎖的區(qū)別和使用方法

mysql的共享鎖與排他鎖的區(qū)別和使用方法

我們看到是可以查詢數(shù)據(jù)的,但加排他鎖就查不到,因?yàn)榕潘i與共享鎖不能存在同一數(shù)據(jù)上。

最后我們驗(yàn)證下上面說的mysql InnoDb引擎中update,delete,insert語句自動(dòng)加排他鎖的問題,

mysql的共享鎖與排他鎖的區(qū)別和使用方法

此時(shí)共享查詢處于阻塞,等待排它鎖的釋放,但是用普通查詢能查到數(shù)據(jù),因?yàn)闆]用上鎖機(jī)制不與排他鎖互斥,但查到的數(shù)據(jù)是修改數(shù)據(jù)之前的老數(shù)據(jù)。

mysql的共享鎖與排他鎖的區(qū)別和使用方法

然后我們提交數(shù)據(jù),釋放排他鎖看下修改后的數(shù)據(jù),此時(shí)可用排他查,共享查和普通查詢, 因?yàn)槭聞?wù)提交后該行數(shù)據(jù)釋放排他鎖,下面就只顯示普通查詢,其他的同學(xué)們自己去驗(yàn)證。

mysql的共享鎖與排他鎖的區(qū)別和使用方法

可以看到結(jié)果與預(yù)期的一樣。

以上就是mysql的共享鎖與排他鎖詳解的詳細(xì)內(nèi)容,更多請關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!

網(wǎng)站欄目:mysql的共享鎖與排他鎖的區(qū)別和使用方法
網(wǎng)站鏈接:http://bm7419.com/article18/jdgigp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、用戶體驗(yàn)響應(yīng)式網(wǎng)站、商城網(wǎng)站、小程序開發(fā)微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)