mysql-innodb锁

锁类型

  1. 行级锁
    • 共享锁(s lock)
    • 排他锁(x lock)
      在这里插入图片描述
  2. 表级锁

    为了在一个事务中揭示下一行将被请求的锁类型。因为innodb支持的是行级锁,所以他不会阻塞除全表以外的任何请求

    • 意向共享锁(is lock)
    • 意向排他锁(ix lock)
      在这里插入图片描述
  3. 加锁过程

    在加行级锁之前,会先加一个同类型的意向锁,再加行级锁
    另一个事务在加锁之前会先判断该表的意向锁和即将要加的行级是否兼容
    优点:避免无意义的判断(例如,如果表先加了xlock,另一个事务想要查询,这时候如果没有意向锁,那么需要将查询的每一列判断是否加
    x lock了)

一致性非锁定读

  1. mvcc(多版本控制读)

    可以不需要等待x lock的释放,直接通过读快照拿到结果,有undo段数据实现,这个快照其实就是该行的历史数据,该行的历史数据是有多个版本的,所以叫mvcc,在不同的事务隔离级别下拿到的快照是不同的
    0.读未提交

    a事务总能读取到最新的快照版本

    1.读已提交

    一旦b事务提交了,a事务就能拿到最新的快照版本

    2.可重复读,快照一直都会是a事务开始时获取的版本
    3串行化

    并发行最低,读取的是最新数据不是快照,但是要求同事只有一个事务

一致性锁定读

innodb 有两种显式加锁

  1. select * for update (排他锁)
  2. select * lock in share mode (共享锁)

锁算法

  1. record lock(锁单条记录)

  2. gap lock(间隙锁,锁范围)

  3. next-key lock(即锁范围,也锁单条记录)(为了解决phantom problem)

    • 如果查询的索引含有唯一索引时,next-key lock会降级为record lock
    • 如果是辅助索引,那么除了锁当前区间外,还会加gap lock,锁下一段区间
      在这里插入图片描述
  4. 解决phantom problem的方法

    • 在可重复读的事务隔离级别下,用next-key lock
    • 将事务隔离级别设置为读已提交
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值