2015-09-18 3 views
1

У меня есть таблица с двумя столбцами: 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 или любые изменения синтаксиса требуются?. Мне интересно, что я должен использовать здесь .. или ничего вообще не использовать.

+0

Да. Спасибо. Хотя мне интересно, если сделки являются правильный путь в этой ситуации, то я надеюсь, что они не Overkill? – sgr12

+0

Почему вы используете 2 Query . ты можешь сделать это с одним; UPDATE itemtable SET item_counter = item_counter + 1 WHERE item_counter <100 ORDER BY RAND() LIMIT 5 –

+0

ИЛИ с двумя запросами с надписью «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 –

ответ

0
BEGIN; 
SELECT ... FOR UPDATE; -- "FOR UPDATE" is the secret sauce. 
UPDATE ... 
COMMIT;