MySQL事务+FOR UPDATE解决并发操作数据库

注意 FOR UPDATE 仅适用于InnoDB,且必须在事务区块(BEGIN/COMMIT)中才能生效。



//PHP利用Mysql锁解决高并发的方法

$pdo = new PDO('mysql:host=127.0.0.1;port=3306; dbname=test_admin122_co', 'test_admin122_co', 'EGtMkiaiZEJESAcL');
$pdo->beginTransaction();//开启事务
$sql = "select `number` from storage where id=1  limit 1 for update ";//利用for update 开启行锁";

$res = $pdo->query($sql)->fetch();

$number = $res['number'];

//var_dump($number);die;
if ($number > 0) {
     

    $sql = "insert into `order` VALUES (null,$number)";


    $order_id = $pdo->query($sql);

    if ($order_id) {
     

        sleep(2);
        $sql = "update storage set `number`=`number`-1 WHERE id=1";

        $i = $pdo->query($sql);
        if ($i) {
     
            $pdo->commit();//提交事务

        } else {
     

            $pdo->rollBack();//回滚

        }

    }else{
     
        $pdo->rollBack();//回滚

    }
echo '减库存成功,当前库存是'.$number.PHP_EOL;
}else{
     
 echo '暂无库存';
}
~                                                                                                                                                                                                                                                
~    

你可能感兴趣的:(PHP)