面试题答案
一键面试概念区别
- 共享锁(S锁):又称读锁,若事务对数据对象A加S锁,那么其他事务只能对A再加S锁,而不能加X锁,直到该事务释放A上的S锁。多个事务可同时对同一数据加S锁,主要用于并发读操作,保证数据一致性。
- 排他锁(X锁):又称写锁,若事务对数据对象A加X锁,那么其他事务不能再对A加任何锁,直到该事务释放A上的X锁。X锁确保只有一个事务能对数据进行修改,防止并发写冲突。
获取方式区别
- 共享锁(S锁):在MySQL中,使用
SELECT ... LOCK IN SHARE MODE
语句获取共享锁。例如:SELECT * FROM users WHERE id = 1 LOCK IN SHARE MODE;
,该语句在查询数据时,会给满足条件的记录加上共享锁。 - 排他锁(X锁):通过
SELECT ... FOR UPDATE
语句获取排他锁。例如:SELECT * FROM users WHERE id = 1 FOR UPDATE;
,此语句在查询数据的同时,会对满足条件的记录加上排他锁。
兼容性区别
- 共享锁(S锁):多个事务可以同时持有同一数据的S锁,即S锁与S锁兼容。但S锁与X锁不兼容,若数据已被加X锁,则其他事务不能再加S锁;若数据已被加S锁,其他事务不能再加X锁。
- 排他锁(X锁):X锁与任何锁都不兼容,只要数据被加了X锁,其他事务不能对其加任何锁,直至X锁被释放。
适用业务场景举例
- 共享锁(S锁)适用场景:
- 商品库存查询:在电商系统中,多个用户同时查询商品库存时,为了保证查询数据的一致性,可使用共享锁。例如,在查询商品库存数量时,使用
SELECT stock FROM products WHERE product_id = 123 LOCK IN SHARE MODE;
,这样在查询过程中,其他事务不能修改该商品库存,确保所有查询看到的库存数据一致。
- 商品库存查询:在电商系统中,多个用户同时查询商品库存时,为了保证查询数据的一致性,可使用共享锁。例如,在查询商品库存数量时,使用
- 排他锁(X锁)适用场景:
- 转账操作:在银行转账业务中,为了防止并发操作导致数据不一致,需要使用排他锁。例如,从账户A向账户B转账,首先要获取账户A和账户B的排他锁,确保在转账过程中,其他事务不能修改这两个账户的余额。可以使用
SELECT balance FROM accounts WHERE account_id = 'A' FOR UPDATE;
和SELECT balance FROM accounts WHERE account_id = 'B' FOR UPDATE;
分别获取两个账户的排他锁,然后进行转账操作。
- 转账操作:在银行转账业务中,为了防止并发操作导致数据不一致,需要使用排他锁。例如,从账户A向账户B转账,首先要获取账户A和账户B的排他锁,确保在转账过程中,其他事务不能修改这两个账户的余额。可以使用