面试题答案
一键面试行级锁特点
- 锁粒度小:仅锁定当前操作涉及的行数据,所以并发性能好,多个事务可以同时对不同行进行操作,减少了锁争用。
- 加锁和释放锁开销相对较大:由于锁粒度精细,数据库需要更多的资源来管理这些锁,例如记录锁的信息等。
表级锁特点
- 锁粒度大:锁定整个表,所以会阻塞其他事务对该表任何行的操作,并发性能相对较差。
- 加锁和释放锁开销小:因为锁的对象是整个表,管理锁的资源开销相对较小。
利用锁设计数据库安全策略防止数据不一致
使用行级锁:
假设存在一个电商系统的订单表 orders
,有订单号 order_id
、用户ID user_id
、订单金额 amount
等字段。当一个用户支付订单时,需要更新订单状态为已支付,同时扣减用户账户余额。可以利用行级锁保证并发操作的正确性。
-- 开启事务
START TRANSACTION;
-- 对订单表中特定订单行加行级锁(使用SELECT ... FOR UPDATE语句)
SELECT * FROM orders WHERE order_id = 12345 FOR UPDATE;
-- 更新订单状态
UPDATE orders SET status = '已支付' WHERE order_id = 12345;
-- 这里可以执行扣减用户余额等其他相关操作
-- 提交事务
COMMIT;
在上述示例中,SELECT ... FOR UPDATE
语句对 order_id
为 12345
的订单行加了行级锁,这样在事务提交前,其他事务不能修改这一行数据,防止了多个事务同时修改同一订单数据导致的数据不一致。
使用表级锁:
假设在一个简单的论坛系统中,有一个帖子表 posts
。在进行一些维护操作,比如批量删除过期帖子时,使用表级锁更合适。
-- 锁定整个帖子表
LOCK TABLES posts WRITE;
-- 执行批量删除过期帖子操作
DELETE FROM posts WHERE expiration_date < NOW();
-- 解锁表
UNLOCK TABLES;
在这个场景下,使用表级锁 LOCK TABLES ... WRITE
锁定了整个 posts
表,防止其他事务在删除操作期间对表进行读写操作,确保批量删除操作的一致性。