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 并插入数据:
2) 向数据表 bbs1 中添加排他锁,命令如下:
3) 添加 NOWAIT 语法(加锁失败)
4) 添加 SKIP LOCKED 语法(跳过被锁记录)
在 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)