首頁 > 軟體

SQL中表鎖定(LOCK、UNLOCK)的具體使用

2022-04-18 16:00:20

MySQL 表鎖定

鎖是與表關聯的標誌。MySQL允許使用者端對談顯式獲取表鎖,以防止其他對談在特定時間段記憶體取同一個表。使用者端對談只能為自己獲取或釋放表鎖。它無法獲取或釋放其他對談的表鎖。

CREATE TABLE tbl (
  id INT NOT NULL AUTO_INCREMENT,
  col INT NOT NULL,
  PRIMARY KEY (id)
) Engine = InnoDB; 

LOCK和UNLOCK TABLES語法

以下語句顯式獲取表鎖:

LOCK TABLES table_name [READ | WRITE] 

要鎖定表,請在LOCK TABLES關鍵字後指定其名稱。此外,您可以指定鎖的型別,可以是 READ或 WRITE。

要釋放表的鎖,請使用以下語句:

UNLOCK TABLES; 

讀鎖

READ鎖具有以下特點:

  • READ可以通過多個對談同時獲取表的鎖。此外,其他對談可以從表中讀取資料而無需獲取鎖。
  • 持有READ鎖的對談只能讀取表中的資料,但無法寫入。此外,在READ釋放鎖之前,其他對談無法將資料寫入表。來自另一個對談的寫入操作將進入等待狀態,直到READ鎖定被釋放。
  • 如果對談正常或異常終止,MySQL將隱式釋放所有鎖。此功能也與WRITE鎖相關。

範例:

在第一個對談中,首先,連線到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鎖定釋放之前,其他對談無法從表中讀取資料並將資料寫入表中。

首先,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; 

看到第二個對談中的所有待處理操作都已執行,下圖說明了結果:

讀鎖與寫鎖 讀鎖是“共用”鎖,它可以防止正在獲取寫鎖,但不能鎖定其他讀鎖。寫鎖是“獨佔”鎖,可以防止任何其他型別的鎖。

到此這篇關於SQL中表鎖定(LOCK、UNLOCK)的具體使用的文章就介紹到這了,更多相關SQL 表鎖定內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com