文章目录
  1. 一致性锁定读
  2. 锁的算法
  3. 锁问题
    1. 脏读
  4. 不可重复读
    1. 丢失更新

一致性锁定读

InnoDB存储引擎支持加锁语句,即使对于SELECT的只读操作。其中,SELECT ...FOR UPDATE对读取的记录加一个X锁,其他事务不能再对该行加上任何锁;SELECT ... LOCK IN SHARE MODE对读取的记录加一个S锁,其他事务可以对该行加S锁,但不能加X锁。

锁的算法

  • Record Lock:单个行记录的锁;
  • Gap Lock:间隙锁,锁定一个范围,但不包含记录本身;
  • Next-Key Lock:锁定一个范围+单个行记录的锁;

Next-Key Locking机制使InnoDB存储引擎避免了幻象问题:在同一事务下,连续执行两次同样的SQL语句可能导致不同的结果。

锁问题

脏读

一个事务可以读到另外一个事务未提交的数据。

不可重复读

在一个事务中对某数据的两次读取之间,由于其他事务的修改,使得两次读取的数据不一样;注意,这里不可重复读读到的是已经提交的数据。

丢失更新

一个事务的更新操作被另一事务的更新操作覆盖。要避免更新丢失,需要让事务在这种情况下的操作变成串行化,而不是并行的操作。