04_记录锁

记录锁(Record Lock)

简介

MySQL 中的记录锁(Record Lock)是行级锁的一种,用于锁定数据库表中的特定行。这种锁是 MySQL InnoDB 存储引擎提供的行级锁机制的一部分,直接作用于存储引擎层面的索引记录上,即锁定单个或多个行记录。

这种锁的主要目的是控制对单个数据行的并发访问,从而支持更高级别的事务隔离,并减少数据操作冲突,提高系统的并发能力,保证数据的一致性和完整性。


原理

当一个事务对某行加记录锁时,实际上是对该行的索引记录(主键索引)进行锁定。如果该表没有定义索引,InnoDB 会隐式创建一个聚簇索引(也称为主键索引),并基于该索引加锁。

当事务尝试修改数据时,InnoDB会自动在被修改的记录上加上排他锁(X锁)。当事务尝试读取数据并且事务隔离级别要求这样做时(如可重复读),InnoDB也可能在被读取的记录上加上共享锁(S锁)。


加锁流程
  1. 事务请求记录锁:事务发出对特定记录加锁的请求。
  2. 索引查找:通过索引找到需要锁定的记录。
  3. 加锁操作:对找到的索引记录加锁(共享锁或排他锁)。如果 SQL 中不是操作的主键索引,那么会通过其他索引来查找到记录,然后锁定记录的主键索引。
  4. 执行操作:持有记录锁的事务可以安全地对该记录进行读或写操作。
  5. 释放锁:事务提交或回滚后,释放记录锁。

锁类型

记录锁包括共享锁(S锁)和排他锁(X锁):

  • 共享锁(S锁):允许多个事务同时读取相同的记录,但不允许修改。
  • 排他锁(X锁):只允许一个事务读取或修改记录,其他事务不能同时读取或修改。

使用场景

记录锁主要在以下场景中使用:

  • 事务处理:在处理事务时,对需要修改的数据行加排他锁,对需要读取的数据行加共享锁(取决于隔离级别),以保证事务的ACID属性。
  • 并发控制:通过对不同行记录加锁,多个事务可以同时对不同的数据行进行操作,大大提高了数据库的并发处理能力。在并发读取场景下防止读操作读取到未提交的变更数据。
  • 避免更新冲突:在并发环境下,记录锁可以防止多个事务同时修改同一条记录,从而避免数据更新冲突。

示例

假设有一个表 users,包含以下数据:

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(50)
);
  1. 事务1
START TRANSACTION;
-- 事务1在 id=1 的记录上加排他锁
SELECT * FROM users WHERE id = 1 FOR UPDATE;
  1. 事务2
START TRANSACTION;
-- 事务2尝试在 id=1 的记录上加共享锁,会被阻塞,等待事务1释放排他锁
SELECT * FROM users WHERE id = 1 LOCK IN SHARE MODE;

在以上示例中:

  • 事务1在 id=1 的记录上加了排他锁(X锁),因此其他事务不能同时读取或修改该记录。
  • 事务2尝试在 id=1 的记录上加共享锁(S锁),但由于记录已被事务1锁定,因此需要等待事务1释放锁后才能继续操作。

与其他锁的对比
锁类型锁定粒度适用范围并发性能使用场景
表锁表级别整个表DDL 操作、大批量更新
行锁(记录锁)行级别特定行(索引记录)高并发读写
意向锁表级别表明意向在某些行上加锁行锁和表锁混合使用
间隙锁行级别索引记录之间的间隙防止幻读
插入意向锁行级别索引记录之间的间隙高并发插入

结论

记录锁在 MySQL 中是实现行级别并发控制的重要机制,通过锁定特定记录来防止数据的并发修改,保证数据的一致性和完整性。在高并发访问场景中,记录锁提供了精细的并发控制能力,有助于提升系统的性能和可靠性。根据不同的需求和使用场景,可以选择合适的锁类型来实现最佳的并发控制策略。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值