MST

星途 面试题库

面试题:MySQL中共享锁与排他锁的互斥性场景及实现

在MySQL数据库中,共享锁(S锁)和排他锁(X锁)存在互斥关系。请描述在一个简单的事务场景下,如何使用共享锁和排他锁,并阐述它们之间的互斥性是如何体现的。假设存在一张名为`users`的表,包含`id`和`name`字段。
46.2万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

使用共享锁(S锁)

  1. 事务场景
    • 假设有事务T1,想要读取users表中id为1的记录,同时希望其他事务也能读取该记录,但不允许修改。
    • 在MySQL中,使用SELECT...LOCK IN SHARE MODE语句来获取共享锁。例如:
START TRANSACTION;
SELECT id, name FROM users WHERE id = 1 LOCK IN SHARE MODE;
-- 这里事务T1对id为1的记录获取了共享锁,可以进行读取操作
-- 其他事务可以并发读取这条记录,但不能获取排他锁进行修改
COMMIT;
  1. 体现共享特性:多个事务可以同时获取共享锁,对同一数据进行读取操作。如果有事务T2也执行SELECT id, name FROM users WHERE id = 1 LOCK IN SHARE MODE;,它可以顺利获取共享锁并读取数据,因为共享锁之间不互斥。

使用排他锁(X锁)

  1. 事务场景
    • 假设有事务T3,想要修改users表中id为1的记录,为了保证数据一致性,必须阻止其他事务读取或修改该记录。
    • 在MySQL中,使用SELECT...FOR UPDATE语句来获取排他锁。例如:
START TRANSACTION;
SELECT id, name FROM users WHERE id = 1 FOR UPDATE;
-- 这里事务T3对id为1的记录获取了排他锁
-- 其他事务不能获取共享锁或排他锁来访问这条记录
UPDATE users SET name = 'new_name' WHERE id = 1;
COMMIT;
  1. 体现排他特性:排他锁具有排他性,一旦事务T3获取了排他锁,其他事务无论是想获取共享锁还是排他锁,都必须等待T3释放锁。例如事务T4执行SELECT id, name FROM users WHERE id = 1 LOCK IN SHARE MODE;SELECT id, name FROM users WHERE id = 1 FOR UPDATE;,都会被阻塞,直到T3执行COMMITROLLBACK释放排他锁。

互斥性体现

  1. 共享锁与排他锁互斥
    • 如果事务T1持有id为1记录的共享锁,此时事务T3尝试获取该记录的排他锁,T3会被阻塞。因为共享锁允许并发读取,但不允许修改,排他锁用于修改数据,二者不能同时存在。
    • 反之,如果事务T3持有id为1记录的排他锁,事务T1尝试获取共享锁,T1同样会被阻塞。这就保证了在数据修改时,不会有其他事务同时进行读取或修改操作,维护了数据的一致性和完整性。