首頁  >  文章  >  資料庫  >  MySQL語法解析之表鎖定

MySQL語法解析之表鎖定

WBOY
WBOY轉載
2022-06-14 12:06:361858瀏覽

這篇文章為大家帶來了關於mysql的相關知識,其中主要介紹了關於表鎖定的相關語法解析,MySQL允許客戶端會話明確獲取表鎖,以防止其他會話在特定時間內訪問同一個表,下面一起來看一下,希望對大家有幫助。

MySQL語法解析之表鎖定

推薦學習:mysql影片教學

#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鎖定具有以下特點:

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

範例:
在第一個會話中,首先,連接到mysqldemo資料庫並使用CONNECTION_ID()函數取得目前連接ID,如下所示:

SELECT CONNECTION_ID();

MySQL語法解析之表鎖定
然後,在tbl表中插入一個新行。

INSERT INTO tbl(col) VALUES(10);

接下來,查詢tbl表中的資料。

SELECT * FROM tbl;

MySQL語法解析之表鎖定
之後,要取得鎖定,請使用LOCK TABLE語句。

LOCK TABLE tbl READ;

最後,在同一個會話中,如果您嘗試在tbl表中插入新行,則會收到錯誤訊息。

INSERT INTO tbl(col) VALUES(11);

MySQL語法解析之表鎖定
因此,一旦READ取得了鎖,就無法在同一會話中將資料寫入表中。

從另一個會話中檢查鎖定。
首先,連接到mysqldemo並檢查連接ID:

SELECT CONNECTION_ID();

MySQL語法解析之表鎖定
然後,從tbl 表中檢索資料:

SELECT * FROM tbl;

MySQL語法解析之表鎖定## 接下來,在tbl表中插入一個新行:

INSERT INTO tbl(col) VALUES(20);

MySQL語法解析之表鎖定 來自第二個會話的插入操作處於等待狀態,因為第一個會話READ已經在tbl表上獲取了鎖,但尚未釋放。

可以從SHOW PROCESSLIST查看詳細資訊。

SHOW PROCESSLIST;

MySQL語法解析之表鎖定 之後,傳回第一個會話並使用UNLOCK TABLES語句釋放鎖定。 READ從第一個會話釋放鎖定後,INSERT執行第二個會話中的操作。

unlock tables;
最後,檢查tbl表的數據,看看INSERT第二個會話的操作是否真的執行了。

SELECT * FROM tbl;

MySQL語法解析之表鎖定

寫入鎖定

WRITE 鎖定具有以下特點:

    儲存表格鎖定的唯一會話可以從表格中讀取取和寫入資料。
  1. 在WRITE鎖定釋放之前,其他會話無法從表中讀取資料並將資料寫入表中。
首先,WRITE從第一個會話中取得鎖定。

LOCK TABLE tbl WRITE;
然後,在tbl表中插入一個新行

INSERT INTO tbl(col) VALUES(11);
有用。

接下來,從tbl表中讀取資料。

SELECT * FROM tbl;

MySQL語法解析之表鎖定

它也有效。

之後,從第二個會話開始,嘗試寫入和讀取資料:

INSERT INTO tbl(col) VALUES(21);
 SELECT * FROM tbl;

MySQL語法解析之表鎖定
MySQL語法解析之表鎖定#

最后,从第一个会话中释放锁定。

UNLOCK TABLES;

看到第二个会话中的所有待处理操作都已执行,下图说明了结果:
MySQL語法解析之表鎖定

读锁与写锁

  1. 读锁是“共享”锁,它可以防止正在获取写锁,但不能锁定其他读锁。
  2. 写锁是“独占”锁,可以防止任何其他类型的锁。

推荐学习:mysql视频教程

以上是MySQL語法解析之表鎖定的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除