SQL中表鎖定(LOCK、UNLOCK)的具體使用
MySQL 表鎖定
鎖是與表關(guān)聯(lián)的標(biāo)志。MySQL允許客戶端會(huì)話顯式獲取表鎖,以防止其他會(huì)話在特定時(shí)間段內(nèi)訪問(wèn)同一個(gè)表??蛻舳藭?huì)話只能為自己獲取或釋放表鎖。它無(wú)法獲取或釋放其他會(huì)話的表鎖。
CREATE TABLE tbl ( id INT NOT NULL AUTO_INCREMENT, col INT NOT NULL, PRIMARY KEY (id) ) Engine = InnoDB;
LOCK和UNLOCK TABLES語(yǔ)法
以下語(yǔ)句顯式獲取表鎖:
LOCK TABLES table_name [READ | WRITE]
要鎖定表,請(qǐng)?jiān)贚OCK TABLES關(guān)鍵字后指定其名稱。此外,您可以指定鎖的類型,可以是 READ或 WRITE。
要釋放表的鎖,請(qǐng)使用以下語(yǔ)句:
UNLOCK TABLES;
讀鎖
READ鎖具有以下特點(diǎn):
- READ可以通過(guò)多個(gè)會(huì)話同時(shí)獲取表的鎖。此外,其他會(huì)話可以從表中讀取數(shù)據(jù)而無(wú)需獲取鎖。
- 持有READ鎖的會(huì)話只能讀取表中的數(shù)據(jù),但無(wú)法寫入。此外,在READ釋放鎖之前,其他會(huì)話無(wú)法將數(shù)據(jù)寫入表。來(lái)自另一個(gè)會(huì)話的寫入操作將進(jìn)入等待狀態(tài),直到READ鎖定被釋放。
- 如果會(huì)話正?;虍惓=K止,MySQL將隱式釋放所有鎖。此功能也與WRITE鎖相關(guān)。
示例:
在第一個(gè)會(huì)話中,首先,連接到mysqldemo數(shù)據(jù)庫(kù)并使用CONNECTION_ID()函數(shù)獲取當(dāng)前連接ID,如下所示:
SELECT CONNECTION_ID();
然后,在tbl表中插入一個(gè)新行。
INSERT INTO tbl(col) VALUES(10);
接下來(lái),查詢tbl表中的數(shù)據(jù)。
SELECT * FROM tbl;
之后,要獲取鎖定,請(qǐng)使用LOCK TABLE語(yǔ)句。
LOCK TABLE tbl READ;
最后,在同一個(gè)會(huì)話中,如果您嘗試在tbl表中插入新行,則會(huì)收到錯(cuò)誤消息。
INSERT INTO tbl(col) VALUES(11);
因此,一旦READ獲取了鎖,就無(wú)法在同一會(huì)話中將數(shù)據(jù)寫入表中。
從另一個(gè)會(huì)話中檢查鎖定。
首先,連接到mysqldemo并檢查連接ID:
SELECT CONNECTION_ID();
然后,從tbl 表中檢索數(shù)據(jù):
SELECT * FROM tbl;
接下來(lái),在tbl表中插入一個(gè)新行:
INSERT INTO tbl(col) VALUES(20);
來(lái)自第二個(gè)會(huì)話的插入操作處于等待狀態(tài),因?yàn)榈谝粋€(gè)會(huì)話READ已經(jīng)在tbl表上獲取了鎖,但尚未釋放。
可以從SHOW PROCESSLIST查看詳細(xì)信息。
SHOW PROCESSLIST;
之后,返回第一個(gè)會(huì)話并使用UNLOCK TABLES語(yǔ)句釋放鎖定。READ從第一個(gè)會(huì)話釋放鎖定后,INSERT執(zhí)行第二個(gè)會(huì)話中的操作。
unlock tables;
最后,檢查tbl表的數(shù)據(jù),看看INSERT第二個(gè)會(huì)話的操作是否真的執(zhí)行了。
SELECT * FROM tbl;
寫鎖
WRITE 鎖具有以下特點(diǎn):
- 保存表鎖的唯一會(huì)話可以從表中讀取和寫入數(shù)據(jù)。
- 在WRITE鎖定釋放之前,其他會(huì)話無(wú)法從表中讀取數(shù)據(jù)并將數(shù)據(jù)寫入表中。
首先,WRITE從第一個(gè)會(huì)話中獲取鎖定。
LOCK TABLE tbl WRITE;
然后,在tbl表中插入一個(gè)新行
INSERT INTO tbl(col) VALUES(11);
有用。
接下來(lái),從tbl表中讀取數(shù)據(jù)。
SELECT * FROM tbl;
它也有效。
之后,從第二個(gè)會(huì)話開始,嘗試寫入和讀取數(shù)據(jù):
INSERT INTO tbl(col) VALUES(21); SELECT * FROM tbl;
最后,從第一個(gè)會(huì)話中釋放鎖定。
UNLOCK TABLES;
看到第二個(gè)會(huì)話中的所有待處理操作都已執(zhí)行,下圖說(shuō)明了結(jié)果:
讀鎖與寫鎖 讀鎖是“共享”鎖,它可以防止正在獲取寫鎖,但不能鎖定其他讀鎖。寫鎖是“獨(dú)占”鎖,可以防止任何其他類型的鎖。
到此這篇關(guān)于SQL中表鎖定(LOCK、UNLOCK)的具體使用的文章就介紹到這了,更多相關(guān)SQL 表鎖定內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql數(shù)據(jù)庫(kù)單表最大存儲(chǔ)依據(jù)詳解
這篇文章主要為大家介紹了mysql數(shù)據(jù)庫(kù)單表最大存儲(chǔ)的依據(jù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07JMeter對(duì)MySQL數(shù)據(jù)庫(kù)進(jìn)行壓力測(cè)試的實(shí)現(xiàn)步驟
本文主要介紹了JMeter對(duì)MySQL數(shù)據(jù)庫(kù)進(jìn)行壓力測(cè)試的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01詳解java調(diào)用ffmpeg轉(zhuǎn)換視頻格式為flv
這篇文章主要介紹了 詳解java調(diào)用ffmpeg轉(zhuǎn)換視頻格式為flv的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09MySQL數(shù)據(jù)庫(kù)是如何實(shí)現(xiàn)XA規(guī)范的
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)是如何實(shí)現(xiàn)XA規(guī)范的,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2021-01-01mysql下mysqladmin日常管理命令總結(jié)(必看篇)
下面小編就為大家?guī)?lái)一篇mysql下mysqladmin日常管理命令總結(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03MySQL實(shí)現(xiàn)清空分區(qū)表單個(gè)分區(qū)數(shù)據(jù)
這篇文章主要介紹了MySQL實(shí)現(xiàn)清空分區(qū)表單個(gè)分區(qū)數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03解決MySQL報(bào)錯(cuò)1267 - Illegal mix of coll
這篇文章主要給大家介紹了解決MySQL報(bào)錯(cuò)1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPL的問(wèn)題,文中有詳細(xì)的解決方案,需要的朋友可以參考下2023-09-09