代码改变世界

MySQL 8.0新特性 -- nowait以及skip locked

  abce  阅读(3165)  评论(0编辑  收藏  举报

如果某行记录被事务锁住了,select ... for update、或select ... for share事务对相同的行加锁的时候必须等待,直到产生阻塞的事务释放锁。

为了避免等待事务释放锁定的行,nowait和skip locked选项可以被用于select ... for update或select ... for share语句:
·nowait:使用了nowait选项的锁定读操作,会立即执行,如果读的记录被锁定了就会报错
·skip locked:使用了skip locked选项的锁定读操作,会立即执行,如果读的记录被锁定了就会从结果集移除该记录。返回的数据是非一致性的。因此,不适用于常规的事务。

nowait和skip locked只适用于行级锁。

nowait和skip locked对于基于语句的复制是不安全的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Session 1:
 
mysql> CREATE TABLE t (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;
 
mysql> INSERT INTO t (i) VALUES(1),(2),(3);
 
mysql> START TRANSACTION;
 
mysql> SELECT * FROM t WHERE i = 2 FOR UPDATE;
+---+
| i |
+---+
| 2 |
+---+
 
# Session 2:
 
mysql> START TRANSACTION;
 
mysql> SELECT * FROM t WHERE i = 2 FOR UPDATE NOWAIT;
ERROR 3572 (HY000): Do not wait for lock.
 
# Session 3:
 
mysql> START TRANSACTION;
 
mysql> SELECT * FROM t FOR UPDATE SKIP LOCKED;
+---+
| i |
+---+
| 1 |
| 3 |
+---+

  

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示