InnoDB使用的七种锁

 

默认事务隔离级别为可重复读(Repeated Read, RR)

InnoDB的锁,与索引类型,事务的隔离级别相关

自增锁

自增锁是一种特殊的表级别锁(table-level lock),专门针对事务插入AUTO_INCREMENT类型的列。最简单的情况,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行,是连续的主键值。

共享/排他锁

共享/排它锁是标准的行级锁(row-level locking)

  • 事务拿到某一行记录的共享S锁,才可以读取这一行;

  • 事务拿到某一行记录的排它X锁,才可以修改或者删除这一行;

  • 多个事务可以拿到一把S锁,读读可以并行;

  • 而只有一个事务可以拿到X锁,写写/读写必须互斥;

共享/排它锁的潜在问题是,不能充分的并行,解决思路是数据多版本

意向锁

意向锁是指,未来的某个时刻,事务可能要加共享/排它锁了,先提前声明一个意向。 意向锁有这样一些特点:

  • 首先,意向锁,是一个表级别的锁(table-level locking);
  • 意向锁分为:
    • 意向共享锁(intention shared lock, IS),它预示着,事务有意向对表中的某些行加共享S锁
    • 意向排它锁(intention exclusive lock, IX),它预示着,事务有意向对表中的某些行加排它X锁

举个例子:

 
  1. select ... lock in share mode,要设置IS锁;

  2. select ... for update,要设置IX锁;

  • 意向锁协议(intention locking protocol)并不复杂:
    • 事务要获得某些行的S锁,必须先获得表的IS锁
    • 事务要获得某些行的X锁,必须先获得表的IX锁

由于意向锁仅仅表明意向,它其实是比较弱的锁,意向锁之间并不相互互斥,而是可以并行的。

排它锁是很强的锁,不与其他类型的锁兼容。这也很好理解,修改和删除某一行的时候,必须获得强锁,禁止这一行上的其他并发,以保障数据的一致性。

插入意向锁

插入意向锁,是间隙锁(Gap Locks)的一种(所以,也是实施在索引上的),它是专门针对insert操作的。

  • 多个事务,在同一个索引,同一个范围区间插入记录时,如果插入的位置不冲突,不会阻塞彼此。
  • 思路总结
    • InnoDB使用共享锁,可以提高读读并发;
    • 排他锁,为了保证数据强一致,InnoDB使用强互斥锁,保证同一行记录修改与删除的串行性;
    • InnoDB使用插入意向锁,可以提高插入并发;

记录锁

记录锁,它封锁索引记录,例如: select * from t where id=1 for update;

它会在id=1的索引记录上加锁,以阻止其他事务插入,更新,删除id=1的这一行。

说明: select * from t where id=1; 则是快照读(SnapShot Read),它并不加锁。

间隙锁

它封锁索引记录中的间隔,或者第一条索引记录之前的范围,又或者最后一条索引记录之后的范围。

 
  1. select * from t

  2. where id between 8 and 15

  3. for update;

这个SQL语句会封锁区间,以阻止其他事务id=10的记录插入。

  • 间隙锁的主要目的,就是为了防止其他事务在间隔中插入数据,以导致“不可重复读”
  • 如果把事务的隔离级别降级为读提交(Read Committed, RC),间隙锁则会自动失效。

临键锁

临键锁,是记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间。

更具体的,临键锁会封锁索引记录本身,以及索引记录之前的区间。

  • 临键锁的主要目的,也是为了避免幻读(Phantom Read)。如果把事务的隔离级别降级为RC,临键锁则也会失效。

 

总结:

  • 记录锁锁定索引记录;
  • 间隙锁锁定间隔,防止间隔中被其他事务插入;
  • 临键锁锁定索引记录+间隔,防止幻读;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值