行锁特点
- 锁的粒度最小:只针对操作的行进行加锁,对并发事务的影响最小。
- 并发性能高:多个事务可以同时操作不同行,减少锁冲突。
- 开销大:由于锁的粒度精细,加锁和解锁的开销相对较大。
表锁特点
- 锁的粒度最大:对整个表进行加锁。
- 开销小:加锁和解锁操作简单,开销小。
- 并发性能低:在表被锁定期间,其他事务无法对该表进行任何操作,容易造成锁冲突。
页锁特点
- 锁的粒度介于行锁和表锁之间:以页(通常是数据页)为单位进行加锁。
- 开销和并发性能适中:加锁和解锁开销比行锁小,比表锁大;并发性能比表锁好,比行锁差。
不同业务场景下锁粒度的选择
- 行锁适用场景:
- 高并发读写场景:例如电商系统的商品库存更新。假设有一个商品库存表
products
,包含 product_id
、stock
等字段。当多个用户同时购买同一款商品时,为了保证库存的准确性,需要使用行锁。如:
START TRANSACTION;
SELECT stock FROM products WHERE product_id = 1 FOR UPDATE;
-- 这里假设业务逻辑是减少库存
UPDATE products SET stock = stock - 1 WHERE product_id = 1;
COMMIT;
- 大量不同行的并发操作:在社交媒体的用户评论表中,每个评论对应一行数据。当大量用户同时发表评论时,使用行锁可以允许不同评论的并发处理。
- 表锁适用场景:
- 数据一致性要求极高,并发操作较少的场景:比如在银行系统进行年终结算时,需要对整个账户表进行锁定,以确保数据的准确性和一致性。如:
LOCK TABLES accounts WRITE;
-- 进行年终结算相关的操作,例如计算总余额等
UNLOCK TABLES;
- 批量操作数据:例如对一个表中的所有数据进行备份,使用表锁可以避免在备份过程中有其他事务对表进行修改,影响备份数据的一致性。
- 页锁适用场景:
- 既有一定的并发读写,又有批量操作的场景:如某些日志表,既有新日志的写入(并发操作),又可能定期对一页的数据进行归档(批量操作)。页锁能够在一定程度上平衡并发性能和锁开销。