У меня есть таблица (InnoDB), которая вставлена, обновляется и читается часто (обычно в пачке в несколько миллисекунд). Я заметил, что иногда оператор SELECT, следующий за INSERT/UPDATE, получает устаревшие данные. Я предполагаю, что это связано с кешем, но после того, как он положил SQL_NO_CACHE
, он ничего не делает.MySQL SQL_NO_CACHE не работает
Как вы убедитесь, что SELECT всегда ждет, пока предыдущий INSERT/UPDATE не закончит и не получит данные из кеша? Обратите внимание, что эти операторы выполняются из отдельных запросов (не в рамках одного и того же исполнения кода).
Может быть, я недоразумение, что на самом деле делает SQL_NO_CACHE ...
UPDATE:
@Uday, то INSERT, SELECT и UPDATE заявление выглядит следующим образом:
INSERT myTable (id, startTime) VALUES(1234, 123456)
UPDATE myTable SET startTime = 123456 WHERE id = 1234
SELECT SQL_NO_CACHE * FROM myTable ORDER BY startTime
Я пробовал использовать транзакции без везения.
Больше UPDATE:
Я думаю, что это на самом деле проблема с INSERT, UPDATE не. Оператор SELECT всегда пытается получить последнюю строку, отсортированную по времени. Но поскольку INSERT не выполняет блокировку на уровне таблицы, возможно, что SELECT получит старые данные. Есть ли способ заставить блокировку на уровне таблицы при выполнении INSERT?
Вы должны опубликовать образцы SELECT и UPDATEs .... – Uday
Что [уровень изоляции] (http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html) - это вы с помощью? Это может произойти, если вы используете 'READ UNCOMMITTED' или 'dirty reads'. –
@MarcusAdams Независимо от уровня изоляции по умолчанию для InnoDB, не уверен, что это отвечает на ваши вопросы. – pixelfreak