《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 悲观锁
准备实体
public class Student {
private Long id ;
private String name ;
private String sno ;
// getters, setters
}
接下来的演示将基于该实体类。
悲观读锁
private EntityManager entityManager ;
public 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