MySQL語法解析之表鎖定

本篇文章給大家?guī)砹岁P(guān)于mysql的相關(guān)知識,其中主要介紹了關(guān)于表鎖定的相關(guān)語法解析,mysql允許客戶端會話顯式獲取表鎖,以防止其他會話在特定時間段內(nèi)訪問同一個表,下面一起來看一下,希望對大家有幫助。

MySQL語法解析之表鎖定

推薦學習:mysql

mysql 表鎖定

鎖是與表關(guān)聯(lián)的標志。MySQL允許客戶端會話顯式獲取表鎖,以防止其他會話在特定時間段內(nèi)訪問同一個表。客戶端會話只能為自己獲取或釋放表鎖。它無法獲取或釋放其他會話的表鎖。

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關(guān)鍵字后指定其名稱。此外,您可以指定鎖的類型,可以是 READ或 WRITE。

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

UNLOCK TABLES;

讀鎖

READ鎖具有以下特點:

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

示例:
在第一個會話中,首先,連接到mysqldemo數(shù)據(jù)庫并使用CONNECTION_ID()函數(shù)獲取當前連接ID,如下所示:

SELECT CONNECTION_ID();

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

INSERT INTO tbl(col) VALUES(10);

接下來,查詢tbl表中的數(shù)據(jù)。

SELECT * FROM tbl;

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

LOCK TABLE tbl READ;

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

INSERT INTO tbl(col) VALUES(11);

MySQL語法解析之表鎖定
因此,一旦READ獲取了鎖,就無法在同一會話中將數(shù)據(jù)寫入表中。

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

SELECT CONNECTION_ID();

MySQL語法解析之表鎖定
然后,從tbl 表中檢索數(shù)據(jù):

SELECT * FROM tbl;

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

INSERT INTO tbl(col) VALUES(20);

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

可以從SHOW PROCESSLIST查看詳細信息。

SHOW PROCESSLIST;

MySQL語法解析之表鎖定
之后,返回第一個會話并使用UNLOCK TABLES語句釋放鎖定。READ從第一個會話釋放鎖定后,INSERT執(zhí)行第二個會話中的操作。

UNLOCK TABLES;

最后,檢查tbl表的數(shù)據(jù),看看INSERT第二個會話的操作是否真的執(zhí)行了。

SELECT * FROM tbl;

MySQL語法解析之表鎖定

寫鎖

WRITE 鎖具有以下特點:

  1. 保存表鎖的唯一會話可以從表中讀取和寫入數(shù)據(jù)。
  2. 在WRITE鎖定釋放之前,其他會話無法從表中讀取數(shù)據(jù)并將數(shù)據(jù)寫入表中。

首先,WRITE從第一個會話中獲取鎖定。

LOCK TABLE tbl WRITE;

然后,在tbl表中插入一個新行

INSERT INTO tbl(col) VALUES(11);

有用。

接下來,從tbl表中讀取數(shù)據(jù)。

SELECT * FROM tbl;

MySQL語法解析之表鎖定

它也有效。

之后,從第二個會話開始,嘗試寫入和讀取數(shù)據(jù):

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

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

最后,從第一個會話中釋放鎖定。

UNLOCK TABLES;

看到第二個會話中的所有待處理操作都已執(zhí)行,下圖說明了結(jié)果:
MySQL語法解析之表鎖定

讀鎖與寫鎖

  1. 讀鎖是“共享”鎖,它可以防止正在獲取寫鎖,但不能鎖定其他讀鎖。
  2. 寫鎖是“獨占”鎖,可以防止任何其他類型的鎖。

推薦學習:mysql

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊15 分享