如何避免与mysql的双重花费

时间:2018-02-09 14:10:39

标签: php mysql

我认为这是一些noob问题 但。说我的用户有平衡。我做了

$stmt1 = $conn->prepare("SELECT `balance` FROM `us` WHERE login=?");
if($balance>20){
 $sql = "UPDATE `us` SET `balance` = `balance`-20 WHERE login = :login";
}

所以,如果我刚要求,那就没关系。但如果在同一时间2个用户要做2个请求余额将是-20。这对我不好。保存交易的任何样本,以避免双倍花费?

1 个答案:

答案 0 :(得分:5)

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

在SQL中:

BEGIN TRANSACTION
SELECT `balance` FROM `us` WHERE login=:login FOR UPDATE
UPDATE `us` SET `balance` = `balance`-20 WHERE login = :login
COMMIT

注意" FOR UPDATE"在第二个声明中;这是非常重要的并锁定所选记录以供后续更新。

另请注意,某些版本的MySQL需要该表具有特定类型才能实际支持事务。