MST

星途 面试题库

面试题:MySQL中常见的锁类型及应用场景

请阐述MySQL中共享锁(S锁)、排他锁(X锁)、意向锁(IS锁、IX锁)的特点,并举例说明它们在实际业务场景中的应用。
46.7万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

共享锁(S锁)

  • 特点
    • 共享锁又称为读锁,若事务对数据对象A加S锁,那么其他事务只能对A再加S锁,不能加X锁,直到该事务释放A上的S锁。这意味着多个事务可以同时对同一数据对象加共享锁,都能读取数据,但不能修改数据,保证了数据读取的并发安全性。
  • 应用场景举例
    • 在电商平台的商品浏览场景中,大量用户同时查看商品信息。为了保证数据一致性,每个查询商品信息的事务可以对商品数据加共享锁。例如,多个用户同时查询某一款手机的参数、价格等信息,他们都可以获得该商品数据的共享锁,从而同时读取数据,而不会互相干扰。

排他锁(X锁)

  • 特点
    • 排他锁又称为写锁,若事务对数据对象A加X锁,那么其他事务不能再对A加任何锁,直到该事务释放A上的X锁。这确保了在同一时刻只有一个事务能对数据进行修改操作,防止并发写操作导致的数据不一致问题。
  • 应用场景举例
    • 在银行转账业务中,当从账户A向账户B转账时,需要对账户A和账户B的数据加排他锁。比如要从用户甲的账户向用户乙的账户转100元,首先对甲账户余额数据加X锁,读取余额后减去100元,更新余额;接着对乙账户余额数据加X锁,读取余额后加上100元,更新余额。在这个过程中,其他事务不能同时修改这两个账户的余额数据,保证了转账操作的原子性和数据一致性。

意向锁(IS锁、IX锁)

  • 特点
    • 意向共享锁(IS锁):事务打算给数据对象的某些行加共享锁(S锁)前,要先给整个数据对象加IS锁。如果事务获取了整个数据对象的IS锁,就表示它或它的子事务打算对该数据对象的某些行加S锁。这是一种表级别的锁,用于告知其他事务该事务有对某些行加共享锁的意图。
    • 意向排他锁(IX锁):事务打算给数据对象的某些行加排他锁(X锁)前,要先给整个数据对象加IX锁。若事务获取了整个数据对象的IX锁,意味着它或它的子事务打算对该数据对象的某些行加X锁。同样是表级别的锁,表明事务有对某些行加排他锁的意图。
    • 意向锁之间是兼容的,即一个事务可以同时持有IS锁和IX锁,但IS锁与X锁不兼容,IX锁与S锁、X锁都不兼容。这样可以在表级别快速判断是否可以获取行锁,避免死锁,提高并发性能。
  • 应用场景举例
    • 在一个论坛系统中,假设要对一篇帖子下的所有评论进行批量修改(加X锁)。在进行操作前,先对帖子这个数据对象加IX锁,表明要对帖子下的某些评论(行数据)加排他锁进行修改。其他事务若想对该帖子加S锁(如查询评论),由于已有IX锁,不兼容,所以无法获取S锁,直到修改操作完成释放IX锁。若只是想对帖子加IS锁(如查询帖子基本信息),因为IS锁和IX锁兼容,所以可以获取IS锁,实现并发查询与批量修改的合理协调。