一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
锁的算法
行锁具有三种算法,分别是
- Record Lock : 单个行记录的锁
- Gap Lock: 锁定一个范围,但不包含记录本身
- Next-Key Lock 前两者之和,锁定一个范围且包含记录本身
Next-Key Lock是被用来解决幻读问题,它锁定的是一个范围,不过当查询的索引含有唯一属性时,他也会降级成为行锁,从而提高数据库的并发性。而对于辅助索引,InnoDB还要对辅助索引的下一个值加上间隙锁,这是为了防止多个事务将记录插入到同一个范围内,从而导致幻读的问题发生。
解决幻读问题
幻读问题是指同一事务下,连续执行两次同样的sql会出现不同的结果,第二次sql会返回之前不存在的行。
这相当于当前事务可以看到其他事务的结果,违背了事务的隔离性,在默认的可重复读的隔离级别,Innodb采用Next-Key Lock 解决幻读问题
锁带来的潜在问题
脏读
我们将事务对缓冲池中行记录的未被提交的修改成为脏数据,如果能读到这类脏数据,即当前事务可以读到未提交的数据,很明显也违背了事务的隔离性。因此只需要隔离级别是提交读以上就不需要担心这个问题
不可重复读
当前事务可以读到其他事务提交的数据,需要隔离级别是可重复读才可以避免。具体实现是上文讲到的Next-Key Lock。
丢失更新
丢失更新指一个事务的更新会被另一个事务的更新锁覆盖,从而导致数据不一致。 然而只要正常对行加锁就不会出现这类问题。
但如果查询并更新并不是事务就会造成一些麻烦。