|
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 10
|
||||||
MySQL Как реализовать многопоточное обновление данных без конфликтов?20.01.2017, 14:51. Показов 1386. Ответов 0
Метки нет (Все метки)
Пере до мной встала интересная задача, с которой я не могу справиться.
Условие: Есть таблица с данными. Нужно в многопоточном режиме последовательно выбирать из таблицы по одной записи и обновлять количество выборов для нее. Каждая запись должна быть выбрана не больше двух раз. Так-же между выбором и обновлением есть микрозадержка. На практике есть скрипт php, который выполняется в многопоточном режиме и выбирает запись из mysql таблицы innodb, которая была выбрана не более 2-х раз до этого, основываясь на поле count. После выбора записи для нёё, поле count увеличивается на 1.
Моё решение - после выборки создавать дополнительный файл для записи, если его нет и инкрементить в него с блокировкой счетчик выборок. Сразу после выборки проверять этот файл и если счетчик в нём 2, пробовать выбрать следующую запись. Однако у этого способа есть недостаток. Проверка происходит уже после выборки и приходится перебирать намного большее количество записей. В моем тесте это увеличило время работы в 100 раз и это очень зависимо от количества потоков и количества данных в таблице. Другой вариант - использовать SELECT FOR UPDATE, но тут есть проблема. Выборка последовательная, а MySQL не имеет способа игнорировать заблокированные строки в SELECT. Получается что каждый момент времени активен лишь 1 скрипт. Провёл тест, запустив одновременно 300 скриптов, получилось что каждый скрипт ждёт завершения активного и только после этого выполняется сам, что получается невероятно долго. При этом выполнились только 60, остальные отвалились по таймауту ожидания разблокировки: Lock wait timeout exceeded; Ещё вариант, считать количество запущенных скриптов, перед каждой выборкой проверять количество данных в таблице и выбирать только из определенного диапазона, доступного конкретному скрипту. Однако в практической задаче, а не в тестовой, каждый скрпт должен иметь доступ ко всем данным таблицы, а не только к части. Что можно предпринять в такой ситуации, сохранив логику работы и приемлемую скорость выполнения? Буду рад любым свежим идеям и предложениям ![]() Кому интересно попробовать разобраться в этом, вот тестовый скрипт: https://yadi.sk/d/mnHA4grn39xBaT create_table.php - создаёт тестовую таблицу с полями id и count, заполняет её данными clear_table.php - обнуляет count в тестовой таблице thread.php - сам скрипт, который делает выборку и инкрементит count run_threads.sh - bash скрипт, который запускает thread.php в 300 потоков
0
|
||||||
| 20.01.2017, 14:51 | |
|
Ответы с готовыми решениями:
0
Добавление оперативной памяти, как обойтись без конфликтов? Как без конфликтов с СКУД получать доступ к её БД из модуля C# Как можно реализовать без setInterval обновление html у пользователя при изменении значения в бд? |
| 20.01.2017, 14:51 | |
|
Помогаю со студенческими работами здесь
1
Обновление данных в таблице, как правильно реализовать? Как реализовать обновление данных в SQL через кнопку на Представлении контроллера
Многопоточное обновление richTextBox Убрать дубли страниц в htaccess без конфликтов со скриптами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла:
Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|