介绍

  • 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连接也会被断开