基于 Spring Boot 玩转JPA各种锁的应用(乐观锁,悲观锁)

文摘   2024-11-29 18:00   新疆  

Spring Boot 3实战案例合集》现已囊括超过50篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。

环境:SpringBoot3.2.5



1. 简介

JPA(Java Persistence API)锁机制是保证数据一致性的关键技术。主要分为乐观锁和悲观锁两种策略。

乐观锁的核心思想是假设多个事务在处理同一数据资源时,冲突的可能性不大。因此,在大多数情况下,它不会去加锁,而是仅在提交更新时检查数据是否被其他事务修改过。如果数据未被修改,操作即可成功执行;反之,则会抛出异常,提示存在冲突。乐观锁的实现通常依赖于数据版本号时间戳

悲观锁则是对数据被外界修改持保守态度,因此在整个事务处理过程中,会将数据处于锁定状态。悲观锁的实现大多依靠数据库提供的锁机制,以保证操作最大程度的独占性,但可能会带来数据库性能的大量开销。

在JPA中,可以通过在实体类中添加版本字段,并使用@Version注解来实现乐观锁。同时,JPA也支持使用EntityManager.find()方法或JPQL的SELECT ... FOR UPDATE语句来实现悲观锁。

在JPA中我们可以设置的锁模式如下:

  • LockModeType.READ

    与OPTIMISTIC(乐观)同义。对于新应用,建议使用OPTIMISTIC。

  • LockModeType.WRITE

    与OPTIMISTIC_FORCE_INCREMENT同义。对于新应用,建议使用OPTIMISTIC_FORCE_INCREMENT。

  • LockModeType.OPTIMISTIC

    乐观锁

  • LockModeType.OPTIMISTIC_FORCE_INCREMENT

    乐观锁,带版本更新。

  • LockModeType.PESSIMISTIC_READ

    悲观读锁

  • LockModeType.PESSIMISTIC_WRITE

    悲观写锁

  • LockModeType.PESSIMISTIC_FORCE_INCREMENT

    悲观写锁,带版本更新

     

接下来我们将详细的展示,各种锁模式下的应用。

2. 实战案例

2.1 悲观锁

准备实体

@Entity@Table(name = "t_student")public class Student {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id ; private String name ; private String sno ;  // getters, setters}

接下来的演示将基于该实体类。

悲观读锁

@PersistenceContextprivate EntityManager entityManager ;
@Transactionalpublic Student find(Long id) { Student student = entityManager.find( Student.class, id, LockModeType.PESSIMISTIC_READ) ; return student ;}

该方法调用会控制台输出如下:

Hibernate:     select        s1_0.id,        s1_0.name,        s1_0.sno,        s1_0.version     from        t_student s1_0     where        s1_0.id=? for share

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章