例题SQL1:select * from tab_user where id = 1 for update
例题SQL2: update tab_user set name = ‘test’ where id = 1
准备工作:SQL1所在事务修改为手动提交事务:set @@autocommit = 1;
我们都知道,select for update根据查询条件是否带索引或主键,会选择性加表锁或行锁,经过sql实验得出如下结果:
select 查询条件 | 锁类型 | update查询条件 | update执行结果 |
---|---|---|---|
id(主键或索引) | 行锁 | id | 可修改其他行记录 |
name(非主键或索引) | 表锁 | name或其他非索引列 | 发生锁超时 |
name(非主键或索引) | 表锁 | id(主键或索引) | 可修改其他行记录 |
name、create_time(都为非主键或索引) | 行锁(多行) | name、create_time | 可修改其他行记录 |
**疑问:**通过某个公众号了解到了这道题,然后发现关于结果第3个实验,在网上找到的结果也与我实验的不一致,例如百度搜索“select for update行锁还是表锁”,看到的文章给出的实验结果如下:
按照自己的测试,根据主键还是可以修改其他行记录的,至于上图为何得出阻塞的结果,还请路过的大佬指点下