SQL银行竞争条件

时间:2017-04-29 19:09:12

标签: mysql postgresql race-condition

我正在NodeJS和SQL数据库中构建银行系统。我需要的两个主要功能是存款和取款。我想确保没有竞争条件。

Ex:用户有100美元的余额,并快速提取100美元两次,最终获得-100美元。

以下查询是否有竞争条件?

update account set balance = balance - x where balance > x

如果这不能解决问题:

如果我使用PostgreSQL,我的余额列上的检查约束是否足以消除所有竞争条件?

如果我使用MySQL,我的选择是什么?

我很想知道在PostgreSQL和MySQL中实现这一目标的不同方法

1 个答案:

答案 0 :(得分:0)

因此,您可以执行以下操作:

  • withdraw()函数中将autocommit设置为false,即启动新事务。
  • 使用SELECT .. FOR UPDATE阅读记录
  • 执行价值检查(即金额是否足以执行操作)
  • UPDATE
  • 结束交易

现在,当用户尝试快速撤回两次时,其中一个调用将启动事务并发出SELECT.. FOR UPDATE调用,这将阻止其他线程读取数据。只有在第一个线程完成后它才会被解锁,即它会阻止race condition

Here's MySQL关于它的文档。