我认为这是一些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。这对我不好。保存交易的任何样本,以避免双倍花费?
答案 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需要该表具有特定类型才能实际支持事务。