Задать вопрос
@steopcik
Сеошник

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 потоках.

Как с этим бороться?
Как сделать так чтобы несколько потоков не работали над одной и той-же строкой?
  • Вопрос задан
  • 218 просмотров
Подписаться 2 Средний 1 комментарий
Ответ пользователя bkosun К ответам на вопрос (4)
@bkosun
Ответ написан
Комментировать