美文网首页
InnoDB-锁

InnoDB-锁

作者: 一只小星_ | 来源:发表于2019-08-26 22:30 被阅读0次
    • 什么是一致性非锁定读,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

    相关文章

      网友评论

          本文标题:InnoDB-锁

          本文链接:https://www.haomeiwen.com/subject/ukccectx.html