MySQL эксклюзивная блокировка с «на обновление» - PullRequest
0 голосов
/ 06 августа 2020

Допустим, у нас есть два потока, оба из которых выполняются одновременно:

1. START TRANSACTION
2. SELECT id, hits FROM table order by hits DESC LIMIT 1 FOR UPDATE
3. INSERT INTO table (id, hits) VALUES (9999, 99999999999)
4. COMMIT

Оба потока переходят к шагу 2, но поток A успевает выполнить первым, поэтому поток B блокируется. Теперь поток A переходит к шагу 3, где он вставляет новую строку в таблицу, которая должна быть результатом, возвращаемым при выполнении запроса на шаге 2. Получит ли поток B новую строку после фиксации потока A?

Судя по быстрому тесту, этого не произошло. Что происходит в фоновом режиме? Блокирует ли mysql всю таблицу, так как нет предложения where, или достаточно ли умен, чтобы заблокировать только указанную строку c? Знает ли он, что результат этого запроса изменился? Есть ли лучшее решение для описанного выше сценария, чтобы поток B получил строку со строкой (9999, 99999999999)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...