InnoDB-锁

  • 什么是一致性非锁定读,MVCC?
  • 什么是一致性锁定读
  • 行锁的三种算法

1.什么是一致性非锁定读?

一致性非锁定读是指InnoDB存储引擎通过行多版本控制的方式来读取当前执行时间数据库中行的数据,如果读取的行正在进行delete/update操作,读取不回因为有排他的行锁就等待,而是去读取行的快照数据。
快照数据是该行之前版本的数据,实现是通过undo字段来完成。这是InnoDB默认的读取方式,但是在不同的数据隔离级别下,读取的方式不同,并不是在每个事务隔离级别下都是采用非锁定的一致性读,即使采用了,对于数据快照的定义也不同。
那么,快照数据其实就是当前行的数据之前的历史版本,每行记录可能有多个版本,一行可能有不止一个快照数据,一般称这种技术为行多版本技术,由此带来的并发控制,叫做多版本并发控制(MVCC)。
在事务隔离级别:读提交、可重复读中,虽然都使用一致性非锁定读,但是对于数据快照的定义是不一样的,在读提交中,每次读取的是行的最新一份快照数据,比如你在一个读取事务里面,读了两次,可能中间这个记录被删掉了,那你第二次读的时候这个数据就不存在了。但是,可重复读的话,它读取的是读取这个事务开始的行数据版本,如果这个读取事务没有结束,中间有人来更新了删掉了,但再次读取的话还是和第一次读取的数值一样,注意是同一个读事务。

2.什么是一致性锁定读?

某些情况下,需要强制读取的一致性,就需要加锁了
select ... for update对读取的行记录加一个X锁
select ... lock in share mode 对读取的行记录加S锁

3.行锁的三种算法

1、Record Lock 单个行记录上的锁
锁的是索引,如果这行没索引,那就会用隐式的主键进行锁定,
2、间隙锁
锁定一个范围,但不包含记录本身。
3、Next-Key Lock
间隙锁➕单个行记录上的锁两者结合,锁定一个范围,并且锁定记录本身。InnoDB都是采用这种算法锁定。

如果事务T1已经通过Next-Key Lock锁定了下面范围:
(10,11]、(11,13]
当插入新的记录12时,锁定范围会变成下面:
(10,11]、(11,12]、(12,13]

但是,如果查询的索引有唯一属性,就会把next-key-locks降级,变成Record Lock,仅锁住索引本身,而不是范围,这也只是在select * from t where
a = 5的情况,只能是在判断相等的时候。
但如果索引没有唯一约束,而查询又是等于的情况,比如select * from t where
a = 5,那么不仅会锁上a=5,如果a的值除了5还有1和7,那么同时也会锁上(1,5),(5,7)这两个范围。

3.1 RR隔离级别怎么避免的幻读

比如你 select * from table where a > 2 for update,那锁住的不仅是大于2的每一行,而是对于2到正无穷这个范围加X锁,在这个范围内的任何插入都是不允许的,避免幻读。

https://juejin.im/post/5d5671a2e51d45620821cea7

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 锁类型 锁是数据库区别与文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问。InnoDB使用的锁类型...
    butterfly100阅读 1,189评论 0 2
  • InnoDB存储引擎实现了如下两种标准的行级锁:共享锁(S Lock),允许事物度一行数据。排他锁(X Lock)...
    黑小鹰阅读 1,103评论 0 0
  • 所在文集:数据库 本文的内容参考了: 架构师之路 - 挖坑,InnoDB的七种锁 架构师之路 - 插入InnoDB...
    专职跑龙套阅读 742评论 0 1
  • 共享和独占锁 InnoDB实现标准的行级锁定,其中有两种类型的锁,共享(S)锁和独占(X)锁。共享(S)锁允许持有...
    wwq2020阅读 786评论 0 0
  • 整天面对这样一个小的小鬼,着实没有什么好说的,除了吃就是睡得年龄,在最近多了种需求,得有人看着、守着他。看不...
    花一开满就相爱_e58e阅读 209评论 0 1