jpa Sprintboot transaction -如何确保所有线程读取最新数据

gcmastyq  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(141)

我正在创建一个具有以下实体的sprintboot Java应用程序

Employee - Entity with following fields
id
status // valid values FREE,BUSY
age

我添加了一个API POST /doTask,它应该将雇员的状态从FREE更改为BUSY。这里的问题是,员工需要一些时间来完成任务,在此之前,他们不应该接受任何新的任务。基本上,员工一次只能做一项任务。
我如何确保当多个线程都调用POST /doTask API时,只有一个线程能够分配任务,而其他所有请求都得到员工忙碌的消息?
我知道我可以使用@ translation注解,但不确定它是否像我期望的那样工作。即只有一个请求应该能够将状态更新为“忙碌”,其余所有请求都应该能够立即读取此状态。
谢谢

j0pj023g

j0pj023g1#

检查锁定。特别是乐观锁定。当与检查版本值的应用程序逻辑一起使用时,乐观锁定可以确保在应用程序读入数据后,没有人会从应用程序中更改数据-因此应用程序将在发生时获得OptmisticLockException。
即:

@Entity
public class Employee {
  @Version
  @Column(name="VERSION")
  int version;
  ...
}

然后,您的Post API需要检查版本值自您上次读取它以来没有更改-如果您将分离的示例合并回上下文,JPA应该为您执行此操作,但如果您读取实体并自己执行合并,则可能必须小心。
请参阅https://wiki.eclipse.org/EclipseLink/Examples/JPA/Locking以获得简短的解释,并且有许多教程可以更好地解释它。

相关问题