Skip to content

面试速答(先看这里)

**一句话结论:**共享锁又称读锁,是读取操作创建的锁 。

60秒标准回答:

共享锁又称读锁,是读取操作创建的锁 。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁

如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。 获得共享锁的事务只能读数据,不能修改数据

在查询语句后面增加LOCK IN SHARE MODE,MySQL会对查询结果中的每行都加共享锁,被加了共享锁的记录还可以被其他事务成功申请共享锁,但是不能被申请排他锁

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。
  • **要点2:**在查询语句后面增加LOCK IN SHARE MODE,MySQL会对查询结果中的每行都加共享锁,被加了共享锁的记录还可以被其他事务成功申请共享锁,但是不能被申请排他锁。
  • **要点3:**排他锁又称写锁, 如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的锁。
  • **要点4:**在查询语句后面增加FOR UPDATE,MySQL会对查询命中的每条记录都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。
  • **要点5:**当这一行数据获取了排他锁,那么其他事务就不能在对这一行数据添加共享锁或者排他锁。

**记忆锚点:**一行数据添加共享锁 → 排他锁又称写锁 → 那么其他事务 → 则其他事务 → MySQL → 共享锁又称读锁是读取操作创建的锁

易错提醒:

  • 其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。
  • 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。

加分表达:

  • 排他锁又称写锁, 如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的锁。

追问准备:

  • 围绕「一行数据添加共享锁」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「排他锁又称写锁」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「那么其他事务」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。

如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获得共享锁的事务只能读数据,不能修改数据。

plain
SELECT ... LOCK IN SHARE MODE;

在查询语句后面增加LOCK IN SHARE MODE,MySQL会对查询结果中的每行都加共享锁,被加了共享锁的记录还可以被其他事务成功申请共享锁,但是不能被申请排他锁。

**排他锁又称写锁,**如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的锁。获得排他锁的事务既能读数据,又能修改数据。

plain
SELECT ... FOR UPDATE;

在查询语句后面增加FOR UPDATE,MySQL会对查询命中的每条记录都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。

总结:

当这一行数据获取了排他锁,那么其他事务就不能在对这一行数据添加共享锁或者排他锁。

当这一行数据获取了共享锁,那么其他事务依然可以对这一行数据添加共享锁,但不能添加排他锁