Я использую MariaDB в приложении PHP. Проблема заключается в следующем: используя Doctrine DBAL с адаптером MySQL, я делаю вставку с одной страницы, а затем перенаправляю на другую, в которой выполняется SELECT. Оба являются очень простыми запросами.
Проблема в том, что SELECT отражает не фактические данные, а более старые. Я размещаю это приложение на виртуальном хостинге, поэтому учтите, что у меня не будет всех доступных опций / разрешений конфигурации БД.
Я попытался очистить после первой INSERT, но он также не работает, и он по-прежнему показывает устаревшие данные. Я считал, что кеши запросов становятся недействительными, если данные изменяются, и что они не применяются, потому что, по сути, это другой запрос.
Я также не использую транзакции, поэтому фиксация предположительно выполняется после вставки. Есть идеи о том, как получить самые последние данные?
Похоже, вы выполняете репликацию, и прокси для направления запросов не обращает внимания на «критические чтения».
В настройке репликации (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 нет ничего для критических чтений, пожаловайтесь им!
Других решений пока нет …