База данных AWS RDS не может прочитать запись, которая была только что записана в базу данных - PullRequest
0 голосов
/ 28 сентября 2018

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

Если после этого я попробую вручную, я найду эту запись.Если я вставлю 1-секундный сон в код, он будет работать правильно.

Я попробовал это, используя отдельные настройки Laravel для чтения и записи хостов.Я также попытался установить их на тот же хост и использовать только один хост.Результат всегда одинаков.Однако в других средах с такой же конфигурацией ошибка отсутствует.

Есть ли в RDS параметр, который необходимо изменить, чтобы сделать запись доступной сразу после ее записи.

1 Ответ

0 голосов
/ 28 сентября 2018

Ошибка связана с mySQL master-slave replication lag.

Распространенной ошибкой является использование кластера mySQL, а затем выполнение чтения сразу после записи.

Поскольку чтение происходит на одном из ведомых /чтение хостов и запись происходит на главном сервере, данные не будут реплицированы во время чтения.

Существует несколько способов исправить ошибку:

  1. Считывание сразу после этого должно быть выполнено на главном (а не на ведомом).Даже если вы упомянули, что вы изменили его на один хост, часто люди делают ошибку при переключении соединения.Обратитесь к этому SO post для правильного переключения соединений в Laravel
  2. Более простым способом может быть использование опции sticky database в Laravel .Осторожно: это может вызвать проблем с производительностью , если не использовать их осторожно только для желаемого вами варианта использования.Из документов:

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

Самый «неочевидный» способ - НЕ выполнять чтение сразу после записи.Подумайте, можно ли этого избежать в зависимости от вашего варианта использования.

Другие методы: см. Этот SO post

...