mysql 行锁(for update)解决高并发

mysql 行锁解决高并发


for update 必须在事务中执行
(避免高并发时库存为负数)
where条件有主键是行锁 否则是表锁

$pdo = new PDO('mysql:host=127.0.0.1;port=3306; dbname=test','root','123456');
$pdo->beginTransaction();//开启事务
$sql="select `number` from storage where id=1 *for UPDATE* ";//利用for update 开启行锁
$res = $pdo->query($sql)->fetch();
$number = $res['number'];
 
if($number>0)
{
  $sql ="insert into `order` VALUES (null,$number)";
 
  $order_id = $pdo->query($sql);
  if($order_id)
  {
 
    $sql="update storage set `number`=`number`-1 WHERE id=1";
    if($pdo->query($sql))
    {
      $pdo->commit();//提交事务
    }
    else
    {
      $pdo->rollBack();//回滚
    }
 
  }
  else
  {
    $pdo->rollBack();//回滚
  }
}

猜你喜欢

转载自blog.csdn.net/wbj16116/article/details/84983067