我正在创建一个具有以下实体的sprintboot Java应用程序
Employee - Entity with following fields
id
status // valid values FREE,BUSY
age
我添加了一个API POST /doTask
,它应该将雇员的状态从FREE
更改为BUSY
。这里的问题是,员工需要一些时间来完成任务,在此之前,他们不应该接受任何新的任务。基本上,员工一次只能做一项任务。
我如何确保当多个线程都调用POST /doTask
API时,只有一个线程能够分配任务,而其他所有请求都得到员工忙碌的消息?
我知道我可以使用@ translation
注解,但不确定它是否像我期望的那样工作。即只有一个请求应该能够将状态更新为“忙碌”,其余所有请求都应该能够立即读取此状态。
谢谢
1条答案
按热度按时间j0pj023g1#
检查锁定。特别是乐观锁定。当与检查版本值的应用程序逻辑一起使用时,乐观锁定可以确保在应用程序读入数据后,没有人会从应用程序中更改数据-因此应用程序将在发生时获得OptmisticLockException。
即:
然后,您的Post API需要检查版本值自您上次读取它以来没有更改-如果您将分离的示例合并回上下文,JPA应该为您执行此操作,但如果您读取实体并自己执行合并,则可能必须小心。
请参阅https://wiki.eclipse.org/EclipseLink/Examples/JPA/Locking以获得简短的解释,并且有许多教程可以更好地解释它。