我正在NodeJS和SQL数据库中构建银行系统。我需要的两个主要功能是存款和取款。我想确保没有竞争条件。
Ex:用户有100美元的余额,并快速提取100美元两次,最终获得-100美元。
以下查询是否有竞争条件?
update account set balance = balance - x where balance > x
如果这不能解决问题:
如果我使用PostgreSQL,我的余额列上的检查约束是否足以消除所有竞争条件?
如果我使用MySQL,我的选择是什么?
我很想知道在PostgreSQL和MySQL中实现这一目标的不同方法
答案 0 :(得分:0)
因此,您可以执行以下操作:
withdraw()
函数中将autocommit设置为false,即启动新事务。SELECT .. FOR UPDATE
阅读记录UPDATE
值现在,当用户尝试快速撤回两次时,其中一个调用将启动事务并发出SELECT.. FOR UPDATE
调用,这将阻止其他线程读取数据。只有在第一个线程完成后它才会被解锁,即它会阻止race condition
。
Here's MySQL关于它的文档。