Состояние гонки в MySQL запросе? Сокращение запасов
Каждый предмет (инвентарь) в инвентаре моделируется как ряд.
stock
=====
code: primary key
itemType: foreign key to items table
available: boolean
Таким образом, чтобы уменьшить запас, что-то вроде:
UPDATE stock SET available = false where code = 'something' and available = true
Это делается в транзакции. Так это выглядит так:
BEGIN TRANSACTION;
UPDATE stock SET available = false where code = 'something1' and available = true;
UPDATE stock SET available = false where code = 'something2' and available = true;
UPDATE stock SET available = false where code = 'something3' and available = true;
COMMIT;
Я подозреваю, что условия гонки возможны. Если бы у меня было 2 запроса, аналогичных приведенным выше, выполняющихся примерно в одно и то же время, они оба были бы успешными?
1 ответ
Они не будут выполнены точно в одно и то же время (для одной базы данных).
Только один за другим.
1 - успешно. (затронутые строки МОГУТ> 0)
2 - не удастся. (затронутые строки = 0)
Так что все в порядке.
Кстати, в вашем запросе нет ничего, что могло бы сломать вещи, если даже оба удастся одновременно (если это будет возможно)...