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