MySQL 乐观锁 (Version 机制) 全面解析(面试必备)

乐观锁是一种无锁并发控制策略,核心思想是“乐观地认为并发冲突不常发生”,只在数据提交时检测冲突。Version 机制是其最常用实现方式,适用于读多写少冲突频率较低的场景(如账户余额更新、库存扣减、状态变更)。

一、 核心原理与流程

  1. 核心思想:

    • 读取数据时,不锁定记录。

    • 更新数据时,检查自读取后版本号(或时间戳等)是否被其他事务修改

    • 如果版本号一致,则更新数据并递增版本号

    • 如果版本号不一致,则认为发生冲突,放弃本次更新(通常通过重试或业务逻辑处理)。

  2. 核心组件:

    • 版本字段 (version): 表中增加一个整型字段(或时间戳字段 update_time),每次成功更新记录时递增(或更新为当前时间)。

    • 读取 (SELECT): 读取数据时,同时获取当前 version 值old_version)。

    • 更新 (UPDATE): 更新时,在 WHERE 条件中包含 version = old_version,并 SET version = new_version

二、 关键实现细节与变种

  1. 版本字段类型选择:

    • 整型 (INT/BIGINT): 最常用。递增简单高效 (version = version + 1)。

    • 时间戳 (TIMESTAMP/DATETIME): 更新时间精确到毫秒/微秒。更新时 SET update_time = NOW(3) (MySQL 5.6.4+ 支持毫秒)。冲突检测粒度更细,但需确保数据库服务器时间同步,且 NOW() 函数精度足够。

    • 哈希/校验和: 对整行数据计算哈希值作为版本。能检测任意字段的修改,但计算开销较大,且 WHERE 条件可能复杂。较少用。

  2. UPDATE 语句的原子性:

    • 关键保障: UPDATE ... WHERE id=xxx AND version=old_version 是原子的。数据库保证在满足条件的记录上执行更新(包括 version = version + 1)是不可分割的操作。

    • 并发安全: 即使多个事务同时执行此 UPDATE,也只有一个能成功修改 version=old_version 的那条记录(如果存在)。其他事务会因条件不匹配而更新 0 行。

  3. 冲突检测 (affected_rows):

    • affected_rows == 0 的含义:

      • 乐观锁冲突 (最常见): 其他事务已成功更新了该记录,导致 version 值改变,不再等于 old_version

      • 记录已被删除: WHERE id=123 AND version=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码里看花‌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值