MySQL update For_MySQL for update

MySQL的存储引擎是InnoDB时 for update有行锁和表锁。

用法:

select ... for update

注意点

仅适用于InnoDB,必须在事务块 begin/commit中才有效

当有明确的主键/索引时是行级别的锁,否则是表级别的锁

验证

数据库表如下

29cef98e478b9ab4d7161043734d32f6.png

id是主键,name有索引,age和createtime无索引

验证1(有明确的主键/索引是是行级别的锁)

Terminal 1 执行

begin;

select * from bintest.afs_test a where a.name='HELLO01' for update;

Termianl 2 执行

update afs_test a set a.name = 'HELLO02' where a.name = 'HELLO020';

该update会被正确执行,name被更改,说明表没有被锁

再执行

update afs_test a set a.name = 'HELLO010' where a.name = 'HELLO01';

这时Terminal2会被block知道Terminal 1执行 commit或者Terminal 2等待超时。

说明当Terminal 1对有索引的name执行查询for update是对行级别的锁

验证2(无明确主键/索引的是表级别的锁)

Terminal 1 执行

begin;

select * from afs_test a where a.age = 20 for update;

Terminal 2 执行

update afs_test a set a.age = a.age+5 where a.age=23;

age是无索引的,Terminal 2更新age=23的记录,与Terminal 1的查询age=20无行记录重合。但Terminal 2的执行会被block,知道Terminal 1执行 commit或者Terminal 2等待超时。说明对无明确主键/索引的是表级别的锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值