Mysql SQL银行竞争条件
我正在NodeJS中构建一个银行系统和一个SQL数据库。我需要的两个主要功能是存款和取款。我想确保没有比赛条件 例如:用户有100$余额,快速提取100$两次,最后得到-100$ 以下查询是否可以具有竞争条件Mysql SQL银行竞争条件,mysql,postgresql,race-condition,Mysql,Postgresql,Race Condition,我正在NodeJS中构建一个银行系统和一个SQL数据库。我需要的两个主要功能是存款和取款。我想确保没有比赛条件 例如:用户有100$余额,快速提取100$两次,最后得到-100$ 以下查询是否可以具有竞争条件 update account set balance=balance-x其中balance>x 如果这不能解决问题: 如果我使用PostgreSQL,平衡列上的检查约束是否足以消除所有竞争条件 如果我使用MySQL,我的选择是什么 我很好奇在PostgreSQL和MySQL中实现这一点的不
update account set balance=balance-x其中balance>x
如果这不能解决问题:
如果我使用PostgreSQL,平衡列上的检查约束是否足以消除所有竞争条件
如果我使用MySQL,我的选择是什么
我很好奇在PostgreSQL和MySQL中实现这一点的不同方法是什么,因此,您可以执行以下操作:
- 在
draw()函数中将autocommit设置为false,即启动新事务
- 使用
以读取记录SELECT。。用于更新
- 对值进行检查(即金额是否足以执行操作)
值更新
- 结束交易
SELECT。。对于UPDATE
调用,这将阻止另一个线程读取数据。只有在第一个线程完成后,它才会被解锁,即它将阻止竞态条件
MySQL的相关文档。为什么不能使用
transaction
?transaction有什么帮助@Darshanmehtae在我的回答中解释了这一点。下面的命令:update account set balance=balance-x,其中balance>x有竞争条件吗?不,没有。但是,在更新余额之前,您需要选择该余额,以防止用户出现负余额,并且该余额确实存在竞争条件,因为选择不会锁定记录。为什么您需要选择任何“第一”项?以在更新之前验证该值