Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL银行竞争条件_Mysql_Postgresql_Race Condition - Fatal编程技术网

Mysql SQL银行竞争条件

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中实现这一点的不

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

例如:用户有100$余额,快速提取100$两次,最后得到-100$

以下查询是否可以具有竞争条件

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有竞争条件吗?不,没有。但是,在更新余额之前,您需要
选择该余额,以防止用户出现负余额,并且该余额确实存在竞争条件,因为
选择
不会锁定记录。为什么您需要选择任何“第一”项?以在更新之前验证该值