MySQL如何为查询操作加锁

2025-11-05 10:16:20

1、为查询的行记录加共享锁

在MySQL数据库中,锁分为两种,共享锁(S锁)和排他锁(X锁),共享锁即一条记录可以加多把该类型的锁。注意,锁必须在一个事务内部使用

图1示,通过在 select 语句后面添加 lock in share mode 即可以为结果集的所有记录添加共享锁。

图2示,在一个会话中为某一条记录添加了一把共享锁,在另一个会话中,还可以为相同记录再加一把共享锁。

MySQL如何为查询操作加锁

MySQL如何为查询操作加锁

2、为查询的行记录加排他锁

排他锁名如其意,一条记录只可加一把排他锁。

图1示,在一个事务内,通过在 select 查询语句后面使用 for update 即可为查询获取的行记录添加排他锁。

图2示,重新打开一个会话,再次尝试为相同的记录添加排他锁,操作被挂起阻塞,当前一个事务提交或等待超时后,这个操作才会继续。

图3示,后面那个尝试加排他锁的事务等待超时而退出

MySQL如何为查询操作加锁

MySQL如何为查询操作加锁

MySQL如何为查询操作加锁

3、排他锁与共享锁也无法共存

上一步骤演示了如何加排他锁,并且无法为同一条记录添加多个排他锁,同样,排他锁也无法和共享锁共存。

图1示:在一个事务内,为一条记录添加一个排他锁。

图2示:在另一个事务内,尝试为这条记录添加一个共享锁,操作被挂起

图3示:将前一个事务提交

图4示:后一个被阻塞的事务成功返回,为相应记录添加了共享锁

MySQL如何为查询操作加锁

MySQL如何为查询操作加锁

MySQL如何为查询操作加锁

MySQL如何为查询操作加锁

4、MySQL Innodb 存储引擎查询加锁总结

1. 默认 select 操作不加锁,通过 MVCC 来实现事务的隔离

2. 通过在 select 语句后面加 lock in share mode 为查询结果集添加共享锁

3. 通过在 select 语句后面加 for update 为查询结果集添加排他锁

 

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢