這篇文章為大家帶來了關於mysql的相關知識,其中主要介紹了關於表鎖定的相關語法解析,MySQL允許客戶端會話明確獲取表鎖,以防止其他會話在特定時間內訪問同一個表,下面一起來看一下,希望對大家有幫助。
推薦學習:mysql影片教學
鎖定是與表格關聯的標誌。 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;
之後,傳回第一個會話並使用UNLOCK TABLES語句釋放鎖定。 READ從第一個會話釋放鎖定後,INSERT執行第二個會話中的操作。
unlock tables;最後,檢查tbl表的數據,看看INSERT第二個會話的操作是否真的執行了。
SELECT * FROM tbl;寫入鎖定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视频教程
以上是MySQL語法解析之表鎖定的詳細內容。更多資訊請關注PHP中文網其他相關文章!