Przypuszczam, że używasz tabel InnoDB, a nie MyISAM. Jak opisano w modelu transakcji InnoDB , wszystkie Twoje zapytania (w tym SELECT) mają miejsce w ramach transakcji.
Gdy AutoCommit
jest włączona, transakcja jest uruchamiana dla każdego zapytania, a jeśli się powiedzie, jest niejawnie zatwierdzana (jeśli się nie powiedzie, zachowanie może się różnić, ale transakcja ma gwarancję zakończenia). Możesz zobaczyć niejawne zatwierdzenia w logu MySQL. Ustawiając AutoCommit
na fałszywe, jesteś zobowiązany do samodzielnego zarządzania transakcjami.
Domyślny poziom izolacji transakcji to POWTARZALNY ODCZYT , co oznacza, że wszystkie SELECT
zapytania będą czytać tę samą migawkę (ustanowioną podczas rozpoczęcia transakcji).
Oprócz rozwiązania podanego w drugiej odpowiedzi (ROLLBACK
zanim zaczniesz czytać) oto kilka rozwiązań:
Możesz wybrać inny poziom izolacji transakcji, np. PRZECZYTAJ ZAANGAŻOWANY
, dzięki czemu Twój SELECT
zapytania odczytują świeżą migawkę za każdym razem.
Możesz także zostawić AutoCommit
na true (ustawienie domyślne) i rozpocznij własne transakcje, wydając BEGIN WORK
. Spowoduje to tymczasowe wyłączenie AutoCommit
zachowanie, dopóki nie wydasz COMMIT
lub ROLLBACK
instrukcja, po której każde zapytanie ponownie otrzymuje własną transakcję (lub zaczynasz kolejną za pomocą BEGIN WORK
).
Osobiście wybrałbym tę drugą metodę, ponieważ wydaje się bardziej elegancka.