Мы используем AWS с репликацией в нашей системе.
Это автоматически переключается на базы данных репликации для запросов, которые не изменяют данные.
Однако у нас есть один запрос, который вызывает функцию MySQL, которая изменяет базу данных. Функция просто создает запись-заполнитель с уникальным идентификатором и возвращает ее с помощью оператора выбора. Что-то похожее на:
«ВЫБЕРИТЕ GenerateUniqueID ()»
Функция Def:
SELECT MAX(lngInvoiceID)
INTO @lngMaxInvoiceID
FROM invoice_table
WHERE GlobalConfigID=in_GlobalConfigID
FOR UPDATE;
SET @lngNewInvoiceID=COALESCE(@lngMaxInvoiceID+1,1);
INSERT INTO invoice_table(datCreated,GlobalConfigID,lngInvoiceID)
VALUES(CURDATE(),in_GlobalConfigID,@lngNewInvoiceID);
RETURN @lngNewInvoiceID;
Однако это приведет к ошибке MySQL: «Сервер MySQL работает с параметром —read-only, поэтому он не может выполнить этот оператор».
Функция GenerateUniqueID в MySQL имеет свой атрибут «Доступ к данным», установленный на «Изменяет данные SQL», и это, похоже, не имеет значения.
Соединение с БД определенно связано с балансировщиком нагрузки.
Есть ли способ заставить запрос работать с узла, который НЕ является репликацией?
Я обошел балансировщик нагрузки и подключился напрямую к мастеру. Это, кажется, останавливает подключение к репликации. Не идеальное решение, но оно решило проблему для меня.
Других решений пока нет …