zoukankan      html  css  js  c++  java
  • Mysql InnoDB存储引擎的锁相关

    • InnoDB下,mysql四个级别隔离下加锁操作

      • 四个级别隔离的写操作都加X锁
      • 串行化下读加S锁
      • select ... for update, select ... lock in share mode 分别加x锁,s锁
      • 在需要加锁的场景下,会根据情况使用三种加锁策略(算法)
        • Record Lock
        • Gap Lock
        • Next-Key Lock
    • mysql RR 为啥能隔离幻读

      • 快照读 select
      • 当前读 select for update, select lock in share mode, delete,insert,update
    • InnoDB提供了一致性的非锁定读、行级锁支持

    • Lock 与Latch

      • Lock 主要用于锁定数据库中的对象,如表、页、行,而Latch主要是线程并发上的资源锁定。
      • Latch的实现采用了乐观spin-wait,所以在竞争比较激烈的并发环境下,性能不是很好,是一种轻量锁。
      • Latch
        • mutex(互斥liang)
        • rwlock(读写锁)
      • Lock
        • 行锁、表锁、页锁
        • 在没有索引的情况下,一般是锁全表的所有行,然后逐行判断解锁
        • 没有实现锁升级
    • 行级锁

      • 共享锁(S Lock)
      • 排他锁 (X Lock)
      • S与S兼容,而X与什么都不兼容
    • 意向锁(事务在更细的粒度上加锁)

      • 意向共享锁(IS Lock) ,事务想要获得一张表中某几行的共享锁
      • 意向排他锁(IX Lock),事务想要获得一张表中某几行的排他锁
      • InnoDB的意向锁是表级别的锁
    • 一致性的非锁定读

      • 通过行多版本控制的方式来读取当前执行时间数据中行的数据。
      • 如果当前行的X锁已经被获得,那么通过undo 段,来获得X锁被获得前的快照,返回该快照的数据
      • 非锁定读,不需要X锁的释放就可以进行操作。可以等同于在事务开始时获得全局快照,在事务运行期间,无论其他事务是否对数据进行提交,都不影响。
    • 一致性锁定读

      • SELECT...FOR UPDATE (加X锁)
      • SELECT... LOCK IN SHARE MODE (加S锁)
    • 自增长与锁

      • SELECT MAX(auto_inc_col) FROM t FOR UPDATE;
    • 外键和锁

      • 对外键值的插入和更新的时候,需要读父表,这时不能采用一致的非锁定读,否则会出现子表与父表不一致的现象。所以需要采用一致性读,也就是给父表加S锁。
    • 行锁的三种算法

      • Record Lock: 单个行记录上的锁
        • 锁的是索引,如果没有设置索引,那么锁的是主键
      • Gap Lock: 间隙锁,锁定一个范围,不包含记录本身
        *
      • Next-Key Lock: Gap Lock + Record Lock, 锁定一个范围,并且锁定记录本身
        • 唯一索引情况下,降级为Record Lock
    • InnoDB通过Next-key Lock避免了幻读问题

      • 通过加两个间隙锁,来保证对于insert,delete操作不会造成幻读
    • 所有隔离级别都实现了写写互斥

    • 四种隔离级别

      • 读未提交
        • 读读不互斥、读写不互斥、写写互斥(不是没有加锁!!!!)
      • 读已提交(一致性的非锁定读)
        • 读读不互斥、读写不互斥、写写互斥
        • 每次读都是读的最新快照 (避免了脏读,通过undo log实现)
      • 可重复读(一致性的非锁定读)
        • 读读不互斥、读写不互斥、写写互斥
        • 每次读都是事务开始时的最新快照 (避免了脏读,不可重复读, 通过undo log实现)
      • 串行化
        • 读读不互斥、读写互斥、写写互斥
        • 读读加的是S锁
        • 容易发生死锁
    • 死锁

      • 发生死锁时,会自动回滚事务
  • 相关阅读:
    Ubuntu使用之Svn命令小技巧
    Android
    Python&MySQL&PyQt
    YII进行数据增删改查分析
    UVA270-Lining Up
    block高级功能
    HDU-2665-Kth number(划分树)
    Android模糊演示样例-RenderScript-附效果图与代码
    HTTP状态码具体解释
    近期写的一个控件——Well Swipe beta 1.0
  • 原文地址:https://www.cnblogs.com/backkom-buaa/p/13502111.html
Copyright © 2011-2022 走看看