Предполагам, че използвате таблици InnoDB, а не MyISAM. Както е описано в InnoDB модел на транзакция , всички вашите заявки (включително SELECT) се извършват в транзакция.
Когато AutoCommit е включена, транзакция се стартира за всяка заявка и ако е успешна, тя е неявно ангажирана (ако не успее, поведението може да варира, но транзакцията е гарантирана, че ще приключи). Можете да видите неявните комити в binlog на MySQL. Като зададете AutoCommit на false, от вас се изисква да управлявате транзакциите сами.
Нивото на изолация на транзакциите по подразбиране е ПОВТОРЯЩО ЧЕТЕНЕ , което означава, че всички SELECT заявките ще прочетат една и съща моментна снимка (тази, установена при стартиране на транзакцията).
В допълнение към решението, дадено в другия отговор (ROLLBACK преди да започнете да четете) ето няколко решения:
Можете да изберете друго ниво на изолация на транзакциите, като ПРОЧЕТЕТЕ СЪВЪРЗАНИ
, което прави вашия SELECT заявките всеки път четат нова моментна снимка.
Можете също да напуснете AutoCommit на true (настройката по подразбиране) и стартирайте свои собствени транзакции, като издадете BEGIN WORK . Това временно ще деактивира AutoCommit поведение, докато не издадете COMMIT или ROLLBACK оператор, след който всяка заявка получава своя собствена транзакция отново (или започвате друга с BEGIN WORK ).
Аз лично бих избрал последния метод, тъй като изглежда по-елегантен.