1
私は、次のコードは、同時に複数のスレッドで実行された場合はどうなるのデータアップデート - 分離
[Shirt, 1, 0]
[Shorts, 10, 0]
でモデル
Inventory [product_name, quantity, reserved_quantity]
を以下のがありますか?
$changes = [
['name' => 'Shirt', 'qty' => 1],
['name' => 'Shorts', 'qty' => 1],
];
$db->startTransaction();
foreach($changes as $change){
$rowsUpdated = $db->exec("UPDATE inventory
SET reserved_quantity = reserved_quantity + $change['qty']
WHERE product_name = $change['name']
and quantity >= reserved_quantity + $change['qty']");
if($rowsUpdated !== 1)
$db->rollback();
exit;
}
$db->commit();
結果はどうなりますか?
[Shirt, 1, 2]
[Shorts, 10, 2]
ありがとうございました!したがって、トランザクションのコミットまたはロールバックが行われない限り、行ロックはそこにあります。これは、select for updateで明示的に要求しなくても可能です。 – user3625393
はいhttp://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html – ffeast
ありがとうございます!あなたが正しい。私はちょうどプロトタイプを作って、あなたが述べたように動作します。 – user3625393