​理解LOCK IN SHARE MODE 以及 FOR UPDATE

概述

InnoDB 提供了两种锁定读取的模式:

  • SELECT ... LOCK IN SHARE MODE

共享锁:又称“读锁”,当事务A对数据row加锁后,在提交前,其他会话可以读取,无法修改。 

  • SELECT ... FOR UPDATE

排它锁:又称“写锁”,当事务A对数据row加锁后,在提交前,其他会话无法读取、修改。

两种模式由InnoDB提供,需要开启事务,都属于MySQL的悲观锁。

准备

准备一张InnoDB 的用户表,并填充部分数据

CREATE TABLE `users` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',

  `username` varchar(32) NOT NULL DEFAULT '' COMMENT '用户名',

  `password` varchar(64) NOT NULL DEFAULT '' COMMENT '密码',

  `state` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '状态',

  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '上次修改时间',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

FOR UPDATE

事务A

在MySQL命令行终端,开启事务A,使用共享锁对id=1加锁

其他会话

在另外一个终端查询该条数据

可以看到,无论是for update 还是lock in share mode都无法读取到数据,查询被阻塞直至超时。

并且无论是否开启事务,都受到了影响

补充

只有事务A提交后,在别的会话才能得到数据

LOCK IN SHARE MODE

事务A

在MySQL命令行终端,开启事务A,使用共享锁对id=1加锁

其他会话

lock in share mode

在另外一个终端,查询该条数据lock in share mode,尝试修改

可以看到,这时候是可以获取数据的,但update被阻塞了。

for update

查询该条数据 尝试修改

可以看到,查询已经被阻塞。

参考资料:

MySQL-doc: InnoDB Locking and Transaction Model | Locking Reads

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值