面试题答案
一键面试行级锁常见类型
- 共享锁(S锁):又称读锁,多个事务可以同时获取共享锁,从而可以同时读取数据,但不允许其他事务获取排他锁修改数据。
- 排他锁(X锁):又称写锁,一旦一个事务获取了排他锁,其他事务既不能获取共享锁也不能获取排他锁,即只有获取排他锁的事务能对数据进行读写操作。
不同场景举例
- 共享锁场景:当多个用户需要同时读取某一行数据时,例如在电商平台中查看商品详情,多个用户并发查看同一商品信息,此时可以使用共享锁。事务执行
SELECT ... LOCK IN SHARE MODE
语句获取共享锁,这样多个事务都能读取数据,而不会相互阻塞。例如:
START TRANSACTION;
SELECT product_name, price FROM products WHERE product_id = 1 LOCK IN SHARE MODE;
-- 此处可以进行读取操作,多个事务可以同时执行此查询并读取数据
COMMIT;
- 排他锁场景:当需要对某一行数据进行修改时,例如电商平台中库存扣减操作,为了避免并发修改导致数据不一致,需要使用排他锁。事务执行
SELECT ... FOR UPDATE
语句获取排他锁。例如:
START TRANSACTION;
SELECT stock FROM products WHERE product_id = 1 FOR UPDATE;
-- 此处读取库存数据后进行扣减操作
UPDATE products SET stock = stock - 1 WHERE product_id = 1;
COMMIT;
在这个场景下,其他事务无法同时获取该数据行的共享锁或排他锁,直到当前事务提交或回滚,保证了数据修改的原子性和一致性。