小编Joã*_*ida的帖子

PostgreSQL 行读锁

让\xe2\x80\x99s 说我有一个名为Withdrawals (id, amount, user_id, status) 的表。

\n\n

每当我发起提款时,流程如下:

\n\n
    \n
  • 验证用户是否有足够的余额(计算方式为收到金额之和 - 提款金额之和)
  • \n
  • 插入包含 amount、user_id 和 status=\xe2\x80\x98pending\xe2\x80\x99 的行
  • \n
  • 通过gRPC调用3rd方软件发起提现(实际是汇款),等待响应
  • \n
  • 一旦我们得到肯定的响应,请更新状态 = \xe2\x80\x98completed\xe2\x80\x99 的行,或者如果提款失败则删除该条目。
  • \n
\n\n

但是,我在此流程中遇到并发问题。\n让\xe2\x80\x99s 假设用户在大约 50 毫秒的差异内发出 2 个全额余额提款请求:

\n\n

要求1

\n\n
    \n
  • 用户有足够的余额
  • \n
  • 创建提款(余额 = 0)
  • \n
  • 更新提款状态
  • \n
\n\n

请求 2(约 50 毫秒后)

\n\n
    \n
  • 用户有足够的余额(这不是真的,另一个插入尚未存储\xe2\x80\x99t)
  • \n
  • 创建提款(余额 = 负数)
  • \n
  • 更新提款状态
  • \n
\n\n

目前,我们使用 Redis 将提款锁定在 x 毫秒内的特定用户,以避免这种情况,但这不是最稳健的解决方案。由于我们现在正在为企业开发 API,因此使用我们当前的解决方案,我们将阻止可能同时请求的提款。\n是否有任何方法可以锁定并确保后续插入查询根据 user_id 等待提款表?

\n

sql postgresql concurrency locking node.js

5
推荐指数
1
解决办法
9217
查看次数

标签 统计

concurrency ×1

locking ×1

node.js ×1

postgresql ×1

sql ×1