Как проверить выбор для обновления в MySQL - PullRequest
3 голосов
/ 24 ноября 2011

Я выполняю SELECT ... FOR UPDATE или блокировку на уровне строки с таблицами InnoDB.

Я хочу, чтобы только один запрос мог прочитать одну и ту же строку.Так что если два пользователя делают запрос на одни и те же данные в одно и то же время.Только один из них получает данные, кто запускает запрос первым.

Но как я могу проверить, установлена ​​ли блокировка или нет.так как я тестирую его, получая одни и те же данные одновременно, и оба пользователя получают данные.

Примечание: мои таблицы InnoDB, мой запрос выполняется в транзакции, мой запрос, как показано ниже:

SELECT * FROM table_name WHERE cond FOR UPDATE;

Любая другая вещь, которую я должен проверить, чтобы это заработало?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2011

Вот документы MySQL о работе с блокировками .

Перед обновлением вы можете поставить блокировку, отпустив ее после.В другой транзакции вы можете проверить блокировку, используя ее уникальное имя.Стратегию именования вы можете выбрать самостоятельно.

0 голосов
/ 24 ноября 2011

Вы можете использовать собственный механизм блокировки со столбцом lock_by.

UPDATE table_name SET locked_by=#{proccess_id} WHERE cond and locked_by IS NULL

Теперь в вашей программе вы получите количество затронутых строк:

if(affected_rows==0)
   return 'rows locked'
else
   //do your staff with locked_by=#{process_id} rows

С помощью этого механизма вы можете управлять заблокированными строками и процессами блокировки. Вы также можете добавить в оператор UPDATE locked_at=NOW(), чтобы получить больше информации о заблокированной строке.

Не забудьте добавить индекс для столбца locked_by.

...