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

锁的分类

按照属性

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

按照粒度

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

InnoDB的行锁实现

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

意向锁

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

MyISAM表锁设计

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

死锁机制

死锁的条件

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

死锁的解决办法

预防死锁

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

避免死锁

  • 银行家算法

检测死锁

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

解除死锁

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

你可能感兴趣的:(一天一道面试题——数据库篇5(锁))