MST

星途 面试题库

面试题:MySQL中如何通过锁机制增强数据库安全策略以防止并发数据修改冲突

在MySQL中,描述一下行级锁和表级锁的特点,并举例说明如何利用它们来设计数据库安全策略,防止多个事务同时修改同一数据导致的数据不一致问题。
41.4万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

行级锁特点

  1. 锁粒度小:仅锁定当前操作涉及的行数据,所以并发性能好,多个事务可以同时对不同行进行操作,减少了锁争用。
  2. 加锁和释放锁开销相对较大:由于锁粒度精细,数据库需要更多的资源来管理这些锁,例如记录锁的信息等。

表级锁特点

  1. 锁粒度大:锁定整个表,所以会阻塞其他事务对该表任何行的操作,并发性能相对较差。
  2. 加锁和释放锁开销小:因为锁的对象是整个表,管理锁的资源开销相对较小。

利用锁设计数据库安全策略防止数据不一致

使用行级锁: 假设存在一个电商系统的订单表 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_id12345 的订单行加了行级锁,这样在事务提交前,其他事务不能修改这一行数据,防止了多个事务同时修改同一订单数据导致的数据不一致。

使用表级锁: 假设在一个简单的论坛系统中,有一个帖子表 posts。在进行一些维护操作,比如批量删除过期帖子时,使用表级锁更合适。

-- 锁定整个帖子表
LOCK TABLES posts WRITE;
-- 执行批量删除过期帖子操作
DELETE FROM posts WHERE expiration_date < NOW();
-- 解锁表
UNLOCK TABLES;

在这个场景下,使用表级锁 LOCK TABLES ... WRITE 锁定了整个 posts 表,防止其他事务在删除操作期间对表进行读写操作,确保批量删除操作的一致性。