首页 > 编程笔记 > MySQL笔记 阅读:9

MySQL NOWAIT和SKIP LOCKED语句:跳过锁等待(附带实例)

MySQL 5.7 版本中,SELECT...FOR UPDATE 语句在执行的时候,如果获取不到锁,会一直等待,直到 innodb_lock_wait_timeout 超时。

在 MySQL 9.0 版本中,通过添加 NOWAIT 和 SKIP LOCKED 语句,能够立即返回。如果查询的行已经加锁,那么 NOWAIT 会立即报错返回;SKIP LOCKED 也会立即返回,只是返回的结果中不包含被锁定的行。

下面通过案例来理解在 MySQL 9.0 版本中如何跳过锁等待。
1) 创建表 bbsl 并插入数据:
mysql> CREATE TABLE bbsl (
    id int,
    name varchar(20)
);

mysql> INSERT INTO bbsl (id, name) VALUES
(101, 'lili'),
(102, 'zhangfeng'),
(103, 'wangming'),
(104, 'wangxiao');

2) 向数据表 bbs1 中添加排他锁,命令如下:
mysql> BDGIN;
mysql> SELECT * FROM bbsl WHERE id = 102 FOR UPDATE;
+-----+-------------+
| id  | name        |
+-----+-------------+
| 102 | zhangfeng   |
+-----+-------------+

3) 添加 NOWAIT 语法(加锁失败)
mysql> SELECT * FROM bbsl WHERE id = 102 FOR UPDATE NOWAIT;
ERROR 3572 (HY000): Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set.

4) 添加 SKIP LOCKED 语法(跳过被锁记录)
mysql> SELECT * FROM bbsl WHERE id = 102 FOR UPDATE SKIP LOCKED;
Empty set (0.00 sec)

相关文章