NoteDeep

锁定读 Locking Reads

如果你在同一个事务里 查询rows,并且insert or update相关的rows。常规的select语句不能给到足够的保护(因为innodb默认是不锁定读,是快照读。)另一个事务可以update or delete 相同的rows。
(你刚刚查询出来的rows,可能已经被其他的事务修改了,不是最新的rows,而是过期的。)
Innodb 支持两种类型的锁定读来提供额外的安全。
  • 给任何被读到的行设置一个共享锁。其他的会话(事务)只能读取这些行,不能修改他们,除非当前事务已经提交了。
  • 如果这些行被另一个事务B修改了,并且事务B还没有提交。那么,你的查询会一直等待,直到事务B结束之后,你才可以查询到最新的值。
  • 被查询的rows,会被上写锁(排他锁),就像在这些行上执行了update语句一样。其他的事务,无法update这些rows,也无法select in share mode。
  • 但是可以在read repeated(consistent reads)隔离级别上select,因为是不加锁的快照读。

评论列表

    锁定读 Locking Reads