【数据库面试题06】MySQL中有哪些锁?

1 锁的概念

锁(Lock)是数据库在并发访问时保证数据库一致性和完整性的主要机制。

MySQL的并发操作:

  • 读-读操作不需要加锁;
  • 写-写操作需要加锁;
  • 读-写操作使用MVCC实现(InnoDB)。

2 锁的分类

MySQL中的锁可以按照粒度分为锁定整个表的表级锁(table-level locking)和锁定数据行的行级锁(row-level locking):

  • 表级锁具有开销小、加锁快的特性;表级锁的锁定粒度大,发生锁冲突的概率高,支持的并发度低;
  • 行级锁具有开销大,加锁慢的特性;行级锁的锁定粒度小,发生锁冲突的概率低,支持的并发度高。

2.1 表级锁

InnoDB存在两种表级锁:

  • LOCK TABLE语句手动指定锁;
    • 其他引擎也可以添加这种锁;
    • 通过LOCK TABLE t READ; 实现读加锁,
    • 通过LOCK TABLE t WRITE; 实现写加锁;
    • 通过LOCK TABLES; 解锁;
  • InnoDB自动添加意向锁,意向锁分为共享和排他两种方式;
    • 意向共享锁(IS):事务在给数据行加行级共享锁之前,必须先取得该表的IS锁;
    • 意向排他锁(IX):事务在给数据行加行级排他锁之前,必须先取得该表的IX锁。
    • 意向共享锁和意向排他锁之间并没有冲突关系,一个表可以加多个意向排他锁或意向共享锁
表锁类型 意向共享锁(IS) 意向排他锁(IX)
意向共享锁(IS) 兼容 兼容
意向排他锁(IX) 兼容 兼容

2.2 行级锁

InnoDB实现了以下两种类型的行锁:

  • 共享锁(S):
    • 允许获得该锁的事务读取数据行(读锁);
    • 允许其他事务获得改数据行上的共享锁;
    • 阻止其他事务获得数据行上的排他锁;
    • 通过FOR SHARE 进行加锁,例如:SELECT * FROM t WHERE id=1 FOR SHARE;
  • 排他锁(X):
    • 允许获得该锁的事务更新或删除数据行(写锁);
    • 阻止其他事务取得该数据行上的共享锁和排他锁。
    • 通过FOR UPDATE 进行加锁,例如:SELECT * FROM t WHERE id=1 FOR UPDATE;

共享锁和排他锁的冲突关系如下:

行锁类型 共享锁(S) 排他锁(X)
共享锁(S) 兼容 冲突
排他锁(X) 冲突 冲突

行级锁和表级锁之间的冲突关系如下:

锁类型 共享锁(S) 排他锁(X) 意向共享锁(IS) 意向排他锁(IX)
共享锁(S) 兼容 冲突 兼容 冲突
排他锁(X) 冲突 冲突 冲突 冲突
意向共享锁(IS) 兼容 冲突 兼容 兼容
意向排他锁(IX) 冲突 冲突 兼容 兼容

版权声明:
作者:jackqiang
链接:http://www.jackqiang.com/interview/interview-db/1992/lock_in_mysql/
来源:JackQiang's
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录