我有两个使用JSON Web令牌从两个不同的后端消费JSON的前端。这些后端作用于同一数据库。
例如在数据库中,我有Driver,Customer和Trip表。客户或驾驶员只有在其中一个人未事先取消旅行的情况下才能取消旅行。取消期间会记录一些交易。
在这种情况下,如何防止客户和驾驶员同时发出取消行程的双重执行?
是我的Spring Boot(RESTful)和Spring JPA。
任何帮助将不胜感激。
编辑:假设这些后端是A和B,客户正在从后端A请求取消,而从B请求驱动程序。
使用乐观锁定。您的代码如下所示:
@Entity
public class Trip {
@Version
@NotNull
private Long version;
...
}
它的工作原理如下。每次更改都会修改版本。假设两个用户(或两个服务)加载了相同版本的trip
。现在他们都试图取消它,即他们都试图修改它。除了更改,它们都发送版本。JPA检查update语句中的版本是否与数据库中的版本相同。因此,第一个请求将获胜并将被执行。在执行期间,版本将增加。
现在第二个请求到达,并且还想取消trip
。JPA将看到update语句中的version属性比数据库中的version值旧(小于)。因此,第二个请求将不会执行,并且OptimisticLockException
将引发。
您可以捕获此异常,同时通知用户数据已更改,并建议用户重新加载数据。用户重新加载数据,并发现该数据trip
已被取消。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句