MySQL锁相关面试题

95 阅读1分钟

为什么要加锁

  • 为了保证多用户下的数据库的完整性和一致性

MYSQL有那些锁呢

按照操作分类

  • 读锁
  • 写锁

按照粒度分类

  • 页锁
  • 表锁
  • 行锁

悲观锁和乐观锁使用方式

  • 悲观锁
    • 每次查询数据都会认为别人会修改,很悲观,所以需要加锁
    • 行锁、表锁、读锁、写锁均是悲观锁
    • 并发度低
  • 乐观锁
    • 每次查询都认为别人不会修改,很乐观,更新的时候会判断一下别人有没有更新数据。
    • 主要是版本号机制或者CAS算法来实现
    • 并发度高

什么是死锁,如何解决死锁

两个或者多个事务在同一资源上互相占用,并请求对方的资源,造成死锁。

  • 尽量的一次性锁住自己所需要的资源
  • 一些业务,如果行锁容易死锁,那么就提高锁的颗粒度,采用表锁
  • 如果不同程序访问多个表,尽量的约定好访问的顺序。

行锁是怎么实现的

  • 记录锁:直接把一条记录锁定

  • 间隙锁:两个记录中逻辑上还没有填入数据的部分,把间隙区间锁定。()开区间。然后如果采用等值查询或者范围查询,那么就会进行锁定

  • 临建锁(Next-key lock):记录锁和间隙锁的组合,除了锁住记录本身,还要锁住所在的间隙。(]

  • Mysql默认为临建锁,如果只有一个记录,会退化成记录锁,如果没有任何记录,那就变成间隙锁