Состояние гонки в 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)

Так что все в порядке.

Кстати, в вашем запросе нет ничего, что могло бы сломать вещи, если даже оба удастся одновременно (если это будет возможно)...

Другие вопросы по тегам