面试题答案
一键面试共享锁(S锁)适用场景
- 读多写少场景:例如电商网站商品详情页的浏览场景,大量用户同时读取商品信息,此时可以使用共享锁。多个事务可以同时获取共享锁,从而实现并发读取,提高系统的并发性能。
- 数据一致性要求高的只读操作:在进行一些统计分析等只读操作时,为了保证数据在读取过程中不被修改,确保数据一致性,可以加共享锁。
排他锁(X锁)适用场景
- 写操作场景:当需要对数据进行修改(如INSERT、UPDATE、DELETE操作)时,为了防止其他事务同时修改该数据,需要使用排他锁。只有获取排他锁的事务才能对数据进行修改,这样可以保证数据修改的原子性和一致性。
- 读-写操作存在数据冲突场景:例如在转账操作中,需要先读取账户余额,再进行余额修改,为了防止在读取余额后,修改余额前,其他事务对余额数据进行修改,需要对相关数据加排他锁。
加锁机制区别
- 共享锁(S锁):
- 当一个事务对数据对象加共享锁后,其他事务只能再加共享锁,不能加排他锁。
- 加锁方式通常是在SELECT语句中使用LOCK IN SHARE MODE子句,例如:
SELECT * FROM table_name WHERE condition LOCK IN SHARE MODE;
- 排他锁(X锁):
- 当一个事务对数据对象加排他锁后,其他事务不能再加任何锁(包括共享锁和排他锁)。
- 加锁方式一般在修改操作的语句(如UPDATE、DELETE等)中自动添加排他锁,也可以在SELECT语句中使用FOR UPDATE子句主动加排他锁,例如:
SELECT * FROM table_name WHERE condition FOR UPDATE;
兼容性区别
- 共享锁(S锁):
- 共享锁之间是兼容的,即多个事务可以同时对同一数据对象加共享锁。例如事务T1和事务T2可以同时对数据A加共享锁,它们都可以读取数据A。
- 共享锁与排他锁不兼容,若数据对象已被加共享锁,则其他事务不能再加排他锁;反之,若数据对象已被加排他锁,则其他事务不能再加共享锁。
- 排他锁(X锁):
- 排他锁与任何锁(包括其他排他锁和共享锁)都不兼容。只要有一个事务对数据对象加了排他锁,其他事务就无法对该数据对象加任何类型的锁,直到排他锁被释放。