Spring REST - 来自不同 API 的数据库并发请求

问题描述

我有两个前端使用 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 检查更新语句中的版本是否与数据库中的版本相同。所以第一个请求获胜并将被执行。在执行过程中,版本将递增。

现在第二个请求到达并且还想取消 trip。 JPA 将看到更新语句中的 version 属性older (less) 比数据库中的 version 值。因此第二个请求不会被执行并且会抛出一个 OptimisticLockException

您可以捕获此异常并通知用户数据在同时发生更改并建议用户重新加载数据。用户重新加载数据并看到 trip 已被取消。