美文网首页
一天一道面试题——数据库篇5(锁)

一天一道面试题——数据库篇5(锁)

作者: 猿哥媛姐 | 来源:发表于2022-02-19 22:22 被阅读0次

    锁的分类

    按照属性

    • 共享锁(读锁)
    • 排它锁(写锁)

    按照粒度

    • 表锁
    • 页锁
    • 行锁(多行)

    InnoDB的行锁实现

    • 记录锁(Record Locks)
      唯一索引,锁定唯一一条记录,必须是唯一索引或者主键索引。
    • 间隙锁(Gap Locks)
      非唯一索引,它锁定一段范围内的索引记录。
      某些SQL语句InnoDB自动加间隙。
    • 临键锁(Next-Key Locks)
      特殊的间隙锁+记录锁,左开右闭。
      每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。

    意向锁

    InnoDB支持表锁和行锁,为了高效的解决行锁和表锁之间的冲突,InnoDB采用意向锁,来表明某个事务正在锁定一行或者将要锁定一行,由InnoDB自动处理。意向锁之间兼容,与表的共享锁和拍他锁互斥。

    MyISAM表锁设计

    • 支持并发读,并发写的性能差,在MySQL Server层实现。
    • 不会出现死锁,因为MyISAM总是一次获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。

    死锁机制

    死锁的条件

    • 互斥条件
    • 请求与保持条件
    • 不可剥夺条件
    • 循环等待条件

    死锁的解决办法

    预防死锁

    • 破坏等待与保持
      一次性分配,申请的资源要么全部满足要么不满足。
      要求每个进程提出新的资源申请前,释放它所占有的资源。
    • 破坏不可以剥夺
      当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源。
    • 破坏循环等待条件
      资源有序分配法,系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反

    避免死锁

    • 银行家算法

    检测死锁

    • 首先为每个进程和每个资源指定一个唯一的号码。
    • 然后建立资源分配表和进程等待表。

    解除死锁

    • 发生死锁后,InnoDB一般都能自动检测到,并使一个事务释放锁并回退,另一个事务获得锁,继续完成事务。
    • 不能检测到的情况,使用锁等待超时参数 innodb_lock_wait_timeout来解决。

    相关文章

      网友评论

          本文标题:一天一道面试题——数据库篇5(锁)

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