首页 > 解决方案 > 并发更新

问题描述

我在 MySQL 中有一个存储用户余额的表:

在此处输入图像描述

我还有一个使用 Spring Boot 和 Kotlin(Restful 服务)构建的应用程序,每次进行交易时都需要更新余额表,但是该应用程序支持来自同一应用程序实例下同一用户的多个同时连接,这里是我有问题。

我有一个使用 R2dbcEntityTemplate 的数据更新方法:https://imgur.com/a/V1m7yEt

此方法从表中读取当前余额,并基于此在每次进行交易时进行折扣,但是,如果用户并行执行多个请求,则恰好其中几个请求可以读取相同的余额并进行折扣不正确,例如:

https://imgur.com/a/Ly19ewS

我想做的是“并发更新安全”,但是,使用 R2dbc 的 API:

update balance
SET balance = balance - @amount
WHERE user = @user

标签: springspring-bootkotlinr2dbcr2dbc-mysql

解决方案


好吧,在更彻底地阅读了 R2dbc 文档后,发现可以从 R2dbcEntityTemplate 运行本机 SQL 查询,这不是我所期望的,但是它非常适合我的应用程序的并发级别。如果有人对此有更好的解决方案,那就太好了,请不要犹豫,因为我最初需要的是这样做,但不是使用本机 SQL 查询,而是直接使用 R2dbc API。这就是它最终的样子,它也可以在不丢失数据保真度的情况下异步执行:

在此处输入图像描述


推荐阅读