Получение задержанных данных при выполнении SELECT по таблице, которая получила INSERT в MariaDB

Я использую MariaDB в приложении PHP. Проблема заключается в следующем: используя Doctrine DBAL с адаптером MySQL, я делаю вставку с одной страницы, а затем перенаправляю на другую, в которой выполняется SELECT. Оба являются очень простыми запросами.

Проблема в том, что SELECT отражает не фактические данные, а более старые. Я размещаю это приложение на виртуальном хостинге, поэтому учтите, что у меня не будет всех доступных опций / разрешений конфигурации БД.

Я попытался очистить после первой INSERT, но он также не работает, и он по-прежнему показывает устаревшие данные. Я считал, что кеши запросов становятся недействительными, если данные изменяются, и что они не применяются, потому что, по сути, это другой запрос.

Я также не использую транзакции, поэтому фиксация предположительно выполняется после вставки. Есть идеи о том, как получить самые последние данные?

0

Решение

Похоже, вы выполняете репликацию, и прокси для направления запросов не обращает внимания на «критические чтения».

В настройке репликации (MariaDB или MySQL) есть один главный сервер и один подчиненный (как минимум). INSERTs (и другие записи) должны происходить на Мастере. Затем они реплицируются на Раба (ов). SELECTsс другой стороны, это может быть сделано на любом сервере, но для распределения нагрузки их лучше выполнять на подчиненном (ых) устройстве (ах).

Репликация «асинхронная». То есть запись в конечном итоге отправляется ведомому и выполняется там. Обычно задержка составляет менее секунды. Но по ряду причин задержка может быть сколь угодно большой. Не следует зависеть от того, насколько быстро реплицируются записи.

Но … Есть вещь, которая называется «Критическое чтение». Это когда SELECT Нужно «увидеть» то, что было только что написано.

У вас есть «критическое чтение».

Я не знаю, что решает направить ваш SELECT рабу.

Если вы используете опцию кластеризации Galera в MariaDB, вы можете защитить себя от критической проблемы чтения, изменив свой выбор на

SET SESSION wsrep_sync_wait = 1;
SELECT ... (as before)
SET SESSION wsrep_sync_wait = 0;

Тем не мение; SETs должен идти к тому же «узлу», что и SELECT, Не зная, что за проксирование происходит, я не могу быть более конкретным.

я надежда вы не переподключаетесь перед каждым утверждением. Это было бы действительно плохо.

Подробнее о проблемах Galera для разработчиков

Если вы используете репликацию, а в Doctrine DBAL нет ничего для критических чтений, пожаловайтесь им!

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]