如何避免与mysql的双重花费

Art*_*lev 0 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";
}
Run Code Online (Sandbox Code Playgroud)

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

Ign*_*ams 5

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

在SQL中:

BEGIN TRANSACTION
SELECT `balance` FROM `us` WHERE login=:login FOR UPDATE
UPDATE `us` SET `balance` = `balance`-20 WHERE login = :login
COMMIT
Run Code Online (Sandbox Code Playgroud)

注意第二个陈述中的"FOR UPDATE"; 这非常重要,并锁定所选记录以供后续更新.

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

  • 这实际上非常整洁。我以前从来不知道MySQL 中的事务。谢谢! (2认同)