推薦學習:
鎖是與表關聯的標誌。MySQL允許使用者端對談顯式獲取表鎖,以防止其他對談在特定時間段記憶體取同一個表。使用者端對談只能為自己獲取或釋放表鎖。它無法獲取或釋放其他對談的表鎖。
CREATE TABLE tbl ( id INT NOT NULL AUTO_INCREMENT, col INT NOT NULL, PRIMARY KEY (id)) Engine = InnoDB;
以下語句顯式獲取表鎖:
LOCK TABLES table_name [READ | WRITE]
要鎖定表,請在LOCK TABLES關鍵字後指定其名稱。此外,您可以指定鎖的型別,可以是 READ或 WRITE。
要釋放表的鎖,請使用以下語句:
UNLOCK TABLES;
READ鎖具有以下特點:
範例:
在第一個對談中,首先,連線到mysqldemo資料庫並使用CONNECTION_ID()函數獲取當前連線ID,如下所示:
SELECT CONNECTION_ID();
然後,在tbl表中插入一個新行。
INSERT INTO tbl(col) VALUES(10);
接下來,查詢tbl表中的資料。
SELECT * FROM tbl;
之後,要獲取鎖定,請使用LOCK TABLE語句。
LOCK TABLE tbl READ;
最後,在同一個對談中,如果您嘗試在tbl表中插入新行,則會收到錯誤訊息。
INSERT INTO tbl(col) VALUES(11);
因此,一旦READ獲取了鎖,就無法在同一對談中將資料寫入表中。
從另一個對談中檢查鎖定。
首先,連線到mysqldemo並檢查連線ID:
SELECT CONNECTION_ID();
然後,從tbl 表中檢索資料:
SELECT * FROM tbl;
接下來,在tbl表中插入一個新行:
INSERT INTO tbl(col) VALUES(20);
來自第二個對談的插入操作處於等待狀態,因為第一個對談READ已經在tbl表上獲取了鎖,但尚未釋放。
可以從SHOW PROCESSLIST檢視詳細資訊。
SHOW PROCESSLIST;
之後,返回第一個對談並使用UNLOCK TABLES語句釋放鎖定。READ從第一個對談釋放鎖定後,INSERT執行第二個對談中的操作。
unlock tables;
最後,檢查tbl表的資料,看看INSERT第二個對談的操作是否真的執行了。
SELECT * FROM tbl;
WRITE 鎖具有以下特點:
首先,WRITE從第一個對談中獲取鎖定。
LOCK TABLE tbl WRITE;
然後,在tbl表中插入一個新行
INSERT INTO tbl(col) VALUES(11);
有用。
接下來,從tbl表中讀取資料。
SELECT * FROM tbl;
它也有效。
之後,從第二個對談開始,嘗試寫入和讀取資料:
INSERT INTO tbl(col) VALUES(21); SELECT * FROM tbl;
最後,從第一個對談中釋放鎖定。
UNLOCK TABLES;
看到第二個對談中的所有待處理操作都已執行,下圖說明了結果:
推薦學習:
以上就是MySQL語法解析之表鎖定的詳細內容,更多請關注TW511.COM其它相關文章!