如何解决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
已被取消。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。