Есть несколько серверов.
1. Сервер MySQL.
2. Демон (WebSocket) с постоянным коннектом к MySQL, в основном пишет в базу.
3. Другой демон с постоянным коннектом к MySQL, в основном читает из базы.
Мне нужно на обоих демонах (2 и 3) получать актуальные данные из базы и редактировать их.
Запрос вида "SELECT SUM(x), SUM(y) FROM table;" на первом (2) демоне отдает актуальный результат. На втором (3) демоне этот же запрос отдает старые данные, которые были в базе на момент запуска демона (коннекта к MySQL), т.е. он всегда (в рамках одного подключения) возвращает одни и те же данные, которые на самом деле уже 1000 раз изменились (другим демоном). Поведение похоже на кеш, добавление SQL_NO_CACHE не помогает.
От чего такое может быть и как это исправить? Переподключение к базе для каждого запроса использовать не хотелось бы т.к. в базу идут тысячи записей в секунду. Демоны работают с базой под разными логинами.
Нашел решение. Кому интересно на питоне mysql.connector нужно делать коммит после каждого селекта (раньше думал это только для изменений, да и в мануале написано что коммит для изменений, но по факту оказалось для селекта тоже).
Если при коннекте Вы открываете транзакцию, то COMMIT или ROLLBACK сбросят Ваши изменения в рамках транзакции и "перечитают" состояние. Посмотрите где Вы открываете транзакцию и уберите ее.
Я ее нигде не открываю. Как я понял mysql.connector на питоне по дефолту работает в транзакционном режиме, автоматом стартует новую транзакцию после CONNECT, COMMIT или ROLLBACK. И на все запросы нужно делать COMMIT. Либо настраивать AUTOCOMMIT. Как-то так получается.