Ich habe folgendes ModellUpdates in mysql Transaktion - Isolation
Inventory [product_name, quantity, reserved_quantity]
mit Daten
[Shirt, 1, 0]
[Shorts, 10, 0]
Was passiert, wenn folgender Code geschieht in mehreren Threads gleichzeitig ausgeführt wird?
$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();
Ist es möglich, dass das Ergebnis sein wird?
[Shirt, 1, 2]
[Shorts, 10, 2]
Danke ffeast! Also ist die Zeilensperre vorhanden, bis die Transaktion nicht festgeschrieben oder rückgängig gemacht wird, auch wenn ich sie nicht explizit mit select for update benötige? – user3625393
Ja http://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html – ffeast
Vielen Dank! Du hast recht. Ich habe gerade ein Prototyping gemacht und funktioniert wie beschrieben. – user3625393