Java并发:乐观锁(Optimistic Locking)

乐观锁的作用

乐观锁是一种并发控制策略,主要用于多用户系统中防止数据的并发修改冲突 。与悲观锁相比,乐观锁假设数据不会经常发生冲突,因此在读取数据 时不加锁,在更新数据时才检查数据是否已被其他事务修改。

实体类示例

展示的实体类Headline和Type使用@Version注解标记版本字段,也就是说当@Version注解被用在一个或多个实体类的同一属性中,这是MyBatis-Plus乐观锁机制的关键。

java 复制代码
@Data
public class Headline implements Serializable {
    @TableId
    private Integer hid;

    private String title;

    private String article;
    @Version
    private Integer version;
}
java 复制代码
@Data
public class Type implements Serializable {
    @TableId
    private Integer tid;

    private String tname;
    @Version
    private Integer version;
}
如何工作

注意! 当使用乐观锁时,每次读取数据后,都会将version字段的值一起读出来。当尝试更新数据 时,MyBatis-Plus会在更新语句中加入一个条件,检查version字段是否等于读取时的值。如果在两次读取之间,数据被其他事务修改过,那么version字段的值将不匹配,从而导致更新失败。

@Version注解指定字段用于版本控制。执行更新操作时,框架自动添加WHERE version = ?条件,并在更新成功后递增version字段的值。

流程:
  1. 假设你有两个事务A和B,它们同时读取了一条记录,此时version字段的值为1。
  2. 事务A尝试更新这条记录,此时version字段的值仍为1。事务B也尝试更新这条记录,但在提交前,事务A已经成功更新了记录并将version字段增加到了2。
  3. 此时当事务B尝试更新时,它的SQL语句会包含WHERE version = 1的条件,但由于version字段已经被事务A更新为2,所以事务B的更新操作会因为版本号不匹配而失败。
如果事务B也需要更新数据时:
  • 此时的version字段的值应该是2(或者更高)。事务B可以再次尝试更新,这次使用最新的version值作为条件。
  • 事务B根据最新的数据准备更新语句,这次WHERE version = 2会被包含在SQL语句中。在没有其他事务更新的情况下,更新将成功,version字段的值将递增到3。
总结流程:

重点!
上面两个实体类中,有需要更新的字段时:

  1. 通过实体的唯一标识(如hid)定位数据库中的具体字段
  2. MyBatis-Plus会自动识别@version注解,自动生成该字段中version字段的sql语句,也就是这个WHERE version = 2
  3. 接着在进行更新的时候会自动比对一下version 是否等于2,如果等于就更新否则失败。

这样,通过@Version注解和version字段,MyBatis-Plus可以有效地实现乐观锁,避免了并发修改带来的数据不一致问题。

相关推荐
2501_903238652 分钟前
Spring Boot日志配置与环境切换实战
数据库·spring boot·后端·个人开发
梓沂5 分钟前
审计级别未启用扩展模式导致查询 DBA_AUDIT_TRAIL 时 SQL_TEXT 列为空
数据库·sql·dba
BUTCHER57 分钟前
Java 使用websocket
java
云缘若仙7 分钟前
directx12 3d+vs2022游戏开发第六章 笔记十一
笔记·directx12 3d
caihuayuan412 分钟前
PHP建立MySQL持久化连接(长连接)及mysql与mysqli扩展的区别
java·大数据·sql·spring
背太阳的牧羊人25 分钟前
RAG检索中使用一个 长上下文重排序器(Long Context Reorder) 对检索到的文档进行进一步的处理和排序,优化输出顺序
开发语言·人工智能·python·langchain·rag
ITPUB-微风27 分钟前
美团MTSQL特性解析:技术深度与应用广度的完美结合
java·服务器·开发语言
电棍23329 分钟前
在wsl环境中配置和开发verilog(一种比较新颖的verilog开发指南)
笔记
Smile丶凉轩29 分钟前
数据库面试知识点总结
数据库·c++·mysql
WeiLai111236 分钟前
面试基础--微服务架构:如何拆分微服务、数据一致性、服务调用
java·分布式·后端·微服务·中间件·面试·架构