介绍
- for update是在数据库中上锁用的,可以为数据库中的行上一个排它锁。
- 当一个事务的操作未完成时候,其他事务可以读取但是不能写入或更新。
使用场景
- 如果遇到存在高并发并且对于数据的准确性很有要求的场景,是需要了解和使用for update的。
一锁二判三更新
使用
1 | select * from table where xxx for update |
锁表
- InnoDB默认是行级别的锁,当有明确指定的主键时候,是行级锁。否则是表级别。
- 行级锁
- 明确指定主键/索引,且有记录
- 无锁
- 明确指定主键/索引,无记录
- 表级锁
- 不使用主键/索引
- 主键/索引不明确,导致主键/索引失效,从而导致整表扫描
表级锁时,无论有无数据,都会锁。
for update 仅适用InnoDB,并且必须开启事务,在begin于commit之间,commit之后会释放。
持有锁时,其他事务均为堵塞状态。只有释放锁之后,其他事务才会拿到锁。
其他
- for update
- 阻塞其他事务
- for update nowait
- 拒绝其他事务
- 事务占据的statement连接也会被断开