MST

星途 面试题库

面试题:MySQL中不同类型锁(共享锁、排他锁)在并发控制中的应用场景及区别

请阐述MySQL里共享锁(S锁)和排他锁(X锁)在并发控制场景下分别适用于哪些情况,它们在获取和释放锁的机制上有什么不同?
33.3万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

共享锁(S锁)适用情况

  1. 读操作并发控制:当多个事务需要同时读取同一数据时,使用共享锁。例如,在一个商品详情页面,多个用户同时查看商品信息,这些读操作可以同时进行,不会相互干扰。通过获取共享锁,多个事务可以并行读取数据,提高系统的并发读性能。
  2. 数据一致性读取:在需要保证数据一致性的读取场景中,如果读取操作不改变数据,使用共享锁。比如在财务报表生成过程中,为了保证报表数据的一致性,在读取相关财务数据时加共享锁,防止其他事务在报表生成期间修改数据。

排他锁(X锁)适用情况

  1. 写操作并发控制:当事务需要对数据进行修改(如INSERT、UPDATE、DELETE)时,使用排他锁。因为写操作会改变数据状态,如果多个写操作并发执行,可能导致数据不一致。例如,多个用户同时修改商品库存数量,只有一个事务能获取排他锁进行修改,其他事务必须等待。
  2. 读写互斥场景:为了保证读操作读到的数据是最新且未被修改的,写操作执行时要防止读操作并发进行。所以在写操作时加排他锁,阻止其他事务获取共享锁或排他锁,避免脏读、不可重复读等问题。

获取锁机制的不同

  1. 共享锁(S锁):多个事务可以同时获取同一数据的共享锁,即共享锁是兼容的。当一个事务请求共享锁时,如果该数据没有被其他事务持有排他锁,那么这个事务就能获取共享锁。例如,事务A获取了数据X的共享锁,此时事务B也可以请求并获取数据X的共享锁。
  2. 排他锁(X锁):排他锁具有排他性,同一时间只能有一个事务获取到排他锁。当一个事务请求排他锁时,如果该数据已经被其他事务持有共享锁或排他锁,那么这个事务必须等待锁释放。例如,事务A获取了数据X的排他锁,事务B请求数据X的排他锁或共享锁都将被阻塞。

释放锁机制的不同

  1. 共享锁(S锁):一般在事务结束时释放共享锁,事务结束包括正常提交(COMMIT)和回滚(ROLLBACK)。例如,事务A获取共享锁读取数据后,执行COMMIT或ROLLBACK操作,共享锁就会被释放,其他事务可以获取该锁。
  2. 排他锁(X锁):同样在事务结束时释放排他锁,无论是正常提交还是回滚。但由于排他锁的排他性,它的释放对并发控制影响更大。例如,事务A持有数据X的排他锁进行修改操作,只有事务A结束并释放排他锁后,其他事务才可能获取共享锁或排他锁对数据X进行操作。