溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL 5.5中LOCK TABLES和UNLOCK TABLES語句有哪些

發(fā)布時間:2021-11-06 10:01:47 來源:億速云 閱讀:122 作者:小新 欄目:MySQL數(shù)據(jù)庫

這篇文章主要介紹了MySQL 5.5中LOCK TABLES和UNLOCK TABLES語句有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

LOCK TABLES 可以為當前客戶端會話的表加鎖。表鎖可以加到表或視圖中。你需要具有LOCK TABLES權(quán)限和對表的查詢權(quán)限。當執(zhí)行LOCK TABLES語句時,表中的觸發(fā)器也會被鎖住。
表鎖可以防止其他會話對表的讀或?qū)憽3钟袑戞i的會話可以執(zhí)行DROP TABLE或TRUNCATE TABLE語句,持有讀鎖的會話,不允許執(zhí)行DROP TABLE或TRUNCATE TABLE語句。

讀鎖(READ [LOCAL] lock)

持有鎖的會話可以讀取表,但是不能執(zhí)行寫入操作。

多個會話可以在同一時間獲取相同表的讀鎖。

其他沒有獲取讀鎖的會話可以讀取表中的內(nèi)容。

LOCAL標識符可以使其他會話執(zhí)行并發(fā)的INSERT語句。對于InnoDB表,READ LOCAL和READ具有同樣的效果。

例子一:
--會話①
mysql> lock table t10 read;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t10;
+------+---------------------+
| name | email               |
+------+---------------------+
| Neo  | feelpurple@163.com  |
| fire | real_neo@163.com    |
| xxx  | real_xiaomm@163.com |
+------+---------------------+
3 rows in set (0.00 sec)

--會話②,可以執(zhí)行查詢語句,對表的DML、DDL操作會處于阻塞狀態(tài),直到會話①表鎖被釋放
mysql> select * from t10;
+------+---------------------+
| name | email               |
+------+---------------------+
| Neo  | feelpurple@163.com  |
| fire | real_neo@163.com    |
| xxx  | real_xiaomm@163.com |
+------+---------------------+
3 rows in set (0.00 sec)

mysql> insert into t10 values('Jason','real_xiaoyu@163.com');

--會話①
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

--會話②
mysql> insert into t10 values('Jason','real_xiaoyu@163.com');
Query OK, 1 row affected (2 min 7.82 sec)

當一個會話獲取表鎖后,這個會話只能訪問被鎖的這張表,直到表鎖被釋放為止。

例子二:
--會話①
mysql> lock table t10 read;
Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from t10;
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from t11;
ERROR 1100 (HY000): Table 't11' was not locked with LOCK TABLES
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from t10;
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from t11;
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

寫鎖(WRITE lock)

持有鎖的會話可以對表執(zhí)行讀寫操作。

只有獲取鎖的會話才能訪問表。只有當鎖釋放掉,其他的會話才可以訪問表。

當表被加上寫鎖的時候,其他對這張表的鎖定請求會被阻塞。

--例子三:

--會話①
mysql> lock table t10 write;
Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from t10;
+----------+
| count(*) |
+----------+
|        4 |
+----------+
1 row in set (0.00 sec)

--會話②,對表的查詢、DML、DDL操作都會處于阻塞狀態(tài),直到會話①表鎖被釋放
mysql> select * from t10;

--會話①
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

--會話②
mysql> select * from t10;
+---------------------+
| email               |
+---------------------+
| feelpurple@163.com  |
| real_neo@163.com    |
| real_xiaomm@163.com |
| real_xiaoyu@163.com |
+---------------------+
4 rows in set (1 min 35.10 sec)

--會話①
mysql> lock table t10 write;
Query OK, 0 rows affected (0.00 sec)

--會話②的DML操作會處于阻塞狀態(tài)
mysql> insert into t10 values('real_xiaolan@163.com');

--會話①
mysql> unlock tables;
Query OK, 0 rows affected (0.01 sec)

--會話②的DML操作成功
mysql> insert into t10 values('real_xiaolan@163.com');
Query OK, 1 row affected (35.04 sec)

--會話①,此時如果會話②不提交或回滾事務(wù),則會話①再次執(zhí)行LOCK TABLE語句會阻塞
mysql> lock table t10 write;

--會話②
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

--會話①
mysql> lock table t10 write;
Query OK, 0 rows affected (24.75 sec)

UNLOCK TABLES 會釋放當前會話的表鎖,也可以釋放FLUSH TABLES WITH READ LOCK(這個命令會給MySQL中所有的數(shù)據(jù)庫加鎖)語句所加的全局只讀鎖。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“MySQL 5.5中LOCK TABLES和UNLOCK TABLES語句有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI