Deadlock не удается излечить - MySQL
Формулировка задачи:
Привет всем. Есть проект с высокой нагрузкой (1000 человек онлайн). Проект на php + mysql. В базе данных есть таблица с записями, которая юзается чуть ли не в половине методов. Иногда выбираем из нее, иногда удаляем, обновляем, вставляем и т.д. Для блокировки записей юзается FOR UPDATE, чаще всего большинство запросов в методе идет через транзакции. Т.к. нагрузка не маленькая, в районе 1000 человек чуть ли не ежесекундно работает с этой таблицей. Дедлоки есть как на инзертах, так и на селектах.
Чтобы избавиться от этого было решено выборку и блокировку записей из таблицы вытащить в отдельный метод, который сначала выбирал с использованием FOR UPDATE, а потом в спец поле записывал время блокировки, все это в отдельной транзакции. Т.е. схема такая - записи выбрали и проставили им некоторый lock_time, другие уже трогать их не должны, далее спокойно работаем с этими записями. - не спасло.
Кто-нибудь может еще что-то посоветовать?
Решение задачи: «Deadlock не удается излечить»
textual
Листинг программы
CREATE TEMPORARY TABLE IF NOT EXISTS tempTable1 AS (SELECT * FROM table1)
Объяснение кода листинга программы
- Создание временной таблицы
tempTable1
с помощью оператора CREATE TEMPORARY TABLE IF NOT EXISTS. - В скобках указывается запрос SELECT * FROM table1, который копирует все данные из таблицы
table1
в новую таблицуtempTable1
. - Запрос выполняется с помощью оператора AS.
- Проверка на существование таблицы
tempTable1
с помощью оператора IF NOT EXISTS. Если таблица не существует, она будет создана.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д