Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.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/8/mysql/65.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
Php 如何避免mysql的双重花费_Php_Mysql - Fatal编程技术网

Php 如何避免mysql的双重花费

Php 如何避免mysql的双重花费,php,mysql,Php,Mysql,我想这是个很难回答的问题 但是假设我的用户有余额。我知道 $stmt1 = $conn->prepare("SELECT `balance` FROM `us` WHERE login=?"); if($balance>20){ $sql = "UPDATE `us` SET `balance` = `balance`-20 WHERE login = :login"; } 所以,如果我有这个要求,那就好了。但是如果两个用户同时做两个请求,那么余额将是-20。那对我不好。是否有保

我想这是个很难回答的问题 但是假设我的用户有余额。我知道

$stmt1 = $conn->prepare("SELECT `balance` FROM `us` WHERE login=?");
if($balance>20){
 $sql = "UPDATE `us` SET `balance` = `balance`-20 WHERE login = :login";
}
所以,如果我有这个要求,那就好了。但是如果两个用户同时做两个请求,那么余额将是-20。那对我不好。是否有保存事务以避免重复花费的示例?

启动事务,锁定要更新的记录,执行更新,然后提交事务

在SQL中:

BEGIN TRANSACTION
SELECT `balance` FROM `us` WHERE login=:login FOR UPDATE
UPDATE `us` SET `balance` = `balance`-20 WHERE login = :login
COMMIT
注意第二条语句中的更新要求;这非常重要,并锁定所选记录以供后续更新

还请注意,MySQL的某些版本需要表为特定类型,以便实际支持事务。

启动事务,锁定要更新的记录,执行更新,然后提交事务

在SQL中:

BEGIN TRANSACTION
SELECT `balance` FROM `us` WHERE login=:login FOR UPDATE
UPDATE `us` SET `balance` = `balance`-20 WHERE login = :login
COMMIT
注意第二条语句中的更新要求;这非常重要,并锁定所选记录以供后续更新


还要注意的是,MySQL的某些版本需要表具有特定的类型才能真正支持事务。

我想说的是,即使是W3傻瓜也知道事务!,当然,他们不会…更新。。。余额>20…我想说的是,即使是傻瓜也知道交易!,当然,他们不会…更新。。。平衡>20…这真的很好。我以前从不知道MySQL中的事务。谢谢这真是太好了。我以前从不知道MySQL中的事务。谢谢