并发更新
Concurrent updates
我在 MySQL 中有一个 table 存储用户的余额:
我还有一个使用 Spring Boot 和 Kotlin(Restful 服务)构建的应用程序,每次进行交易时都需要更新余额 table,但该应用程序支持同一应用程序实例下同一用户的多个同时连接,这就是我遇到问题的地方。
我有一个使用 R2dbcEntityTemplate 的数据更新方法:
此方法从 table 中读取当前余额,并基于此在每次进行交易时打折,但是,如果用户并行执行多个请求,则会发生多个请求这些请求可以读取相同的余额并错误地进行折扣,例如:
我想要做的是“并发更新安全”,但是,使用 R2dbc 的 API:
update balance
SET balance = balance - @amount
WHERE user = @user
好吧,在更彻底地阅读 R2dbc 文档后发现原生 SQL 查询可以来自 R2dbcEntityTemplate 运行,这不是我所期望的,但是,它非常适合我的应用程序的并发级别.如果有人对此有更好的解决方案,那就太好了,请不要犹豫 post 它,因为我最初要求的是这样做,但不是使用本机 SQL 查询,而是直接使用 R2dbc API。这就是它最终的样子,它也可以异步执行而不会丢失数据的保真度:
我在 MySQL 中有一个 table 存储用户的余额:
我还有一个使用 Spring Boot 和 Kotlin(Restful 服务)构建的应用程序,每次进行交易时都需要更新余额 table,但该应用程序支持同一应用程序实例下同一用户的多个同时连接,这就是我遇到问题的地方。
我有一个使用 R2dbcEntityTemplate 的数据更新方法:
此方法从 table 中读取当前余额,并基于此在每次进行交易时打折,但是,如果用户并行执行多个请求,则会发生多个请求这些请求可以读取相同的余额并错误地进行折扣,例如:
我想要做的是“并发更新安全”,但是,使用 R2dbc 的 API:
update balance
SET balance = balance - @amount
WHERE user = @user
好吧,在更彻底地阅读 R2dbc 文档后发现原生 SQL 查询可以来自 R2dbcEntityTemplate 运行,这不是我所期望的,但是,它非常适合我的应用程序的并发级别.如果有人对此有更好的解决方案,那就太好了,请不要犹豫 post 它,因为我最初要求的是这样做,但不是使用本机 SQL 查询,而是直接使用 R2dbc API。这就是它最终的样子,它也可以异步执行而不会丢失数据的保真度: