Mysql — Как заморозить доступ к строке чтобы другие потоки не работали с ней?
Есть Mysql база данных пользователей и многопоточная с# программа. Структура таблицы:
ID (bigint)
Text (varchar)
Verified (boolean)
Thread (boolean) false по умолчанию / true если поток работает с данной строкой (для блокировки строки) Текуший сценарий выполнения:
1 - Запрос на получение строки Verified = False
2 - Устанавливаем на время работы Thread = True
3 - Выполняем ритуал Вуду с полученными данными
4 - Устанавливаем Verified = True
5 - Устанавливаем Thread = False, и освобождаем для других многопоточных сценариев.
Проблема первая, пока установится Thread = True на втором шаге, другой поток успевает получить туже строку, поскольку втиснулся поток между шагом один и два, аккурат до блокировки строки.
Первая идея, проблема в слишком быстром выполнения сценария. При 10 потоках 50% обрабатываю туже строку, на 90 потоках 80% работают с той-же строкой.
Решение добавить рандомные задержки перед запросом. Чуть помогло, только 20% потоков обрабатывают туже строку при 10 потоках и 10% при 90 потоках.
Как с этим бороться?
Как сделать так чтобы несколько потоков не работали над одной и той-же строкой?
Может я не в теме, но тег стоит C# и у меня возникает вопрос: почему нет блокировки запроса на уровне кода? Что-то вроде очереди запросов. Потоки просто ставят запросы в очередь и ожидают их ответов. Решается это не долго.