【发布时间】:2018-09-20 12:42:38
【问题描述】:
假设我有一个名为 Withdrawals (id, amount, user_id, status) 的表。
每当我发起提款时,流程如下:
- 验证用户是否有足够的余额(计算为收到金额的总和 - 提款金额的总和)
- 插入包含金额、user_id 和 status='pending' 的行
- 通过gRPC调用第三方软件发起提现(实际是汇款),等待响应
- 一旦我们做出肯定的回应,就会立即更新状态为“已完成”的行,如果提款失败,则删除该条目。
但是,我在此流程中遇到了并发问题。 假设用户在大约 50 毫秒的差异内提出了 2 次全额提款请求:
请求 1
- 用户余额充足
- 创建提款(余额 = 0)
- 更新提现状态
请求 2(约 50 毫秒后)
- 用户有足够的余额(这是不正确的,其他插入尚未存储)
- 创建提款(余额 = 负数)
- 更新提现状态
目前,如果特定用户在 x 毫秒内,我们正在使用 redis 锁定提款,以避免这种情况,但这不是最强大的解决方案。由于我们现在正在为企业开发 API,使用我们当前的解决方案,我们将阻止可能同时请求的提款。 有什么方法可以根据 Withdrawals 表的 user_id 锁定并确保随后的插入查询等待?
【问题讨论】:
-
假设您添加了一些代码并解释了您当前作为输出(或错误)得到的内容,预期的输出结果将帮助人们考虑回答您的问题。问一个没有样本数据(与问题相关的表格和字段)的问题并不是真正值得一看的东西!只是一个提示!
标签: sql node.js postgresql concurrency locking