У меня есть таблица с двумя столбцами: item_id (интермедиат, авто вкл) и item_counter (целое, значение по умолчанию 0)MySQL: UPDATE Параллелизм
Пользователь на веб-странице выделяется несколько пунктов, введя форму , Это пробелы:
SELECT * FROM itemtable WHERE item_counter<100 ORDER BY RAND() LIMIT 5
За этим следует запрос UPDATE, увеличивающий item_counter каждого из этих элементов.
UPDATE itemtable SET item_counter=item_counter + 1 WHERE item_id=:item_id
Около 20-50 пользователей будут выполнять эту операцию сразу.
Простое приложение. 1 SELECT и 5 UPDATE являются последовательными для каждого пользователя, и я хочу, чтобы item_counter был точным (избегая этого сценария: item_id выбран как имеющий item_counter 99, но обновляется другим пользователем до того, как этот пользователь сможет его обновить.
Должен ли я использовать параллелизм/блокировку в этом? Я не знаю, является ли блокировка на уровне строк InnoDB неотъемлемой частью всех операций UPDATE или любые изменения синтаксиса требуются?. Мне интересно, что я должен использовать здесь .. или ничего вообще не использовать.
Да. Спасибо. Хотя мне интересно, если сделки являются правильный путь в этой ситуации, то я надеюсь, что они не Overkill? – sgr12
Почему вы используете 2 Query . ты можешь сделать это с одним; UPDATE itemtable SET item_counter = item_counter + 1 WHERE item_counter <100 ORDER BY RAND() LIMIT 5 –
ИЛИ с двумя запросами с надписью «FOR UPDATE». Это заблокирует запись SELECT * FROM itemtable FOR UPDATE WHERE item_counter <100 ORDER BY RAND() LIMIT 5; http://dev.mysql.com/doc/refman/5.6/en/innodb-locking-reads.html –