Mysql
 sql >> база данни >  >> RDS >> Mysql

DBI манипулатор на база данни с AutoCommit, зададен на 0, не връща правилни данни с SELECT?

Предполагам, че използвате таблици InnoDB, а не MyISAM. Както е описано в InnoDB модел на транзакция , всички вашите заявки (включително SELECT) се извършват в транзакция.

Когато AutoCommit е включена, транзакция се стартира за всяка заявка и ако е успешна, тя е неявно ангажирана (ако не успее, поведението може да варира, но транзакцията е гарантирана, че ще приключи). Можете да видите неявните комити в binlog на MySQL. Като зададете AutoCommit на false, от вас се изисква да управлявате транзакциите сами.

Нивото на изолация на транзакциите по подразбиране е ПОВТОРЯЩО ЧЕТЕНЕ , което означава, че всички SELECT заявките ще прочетат една и съща моментна снимка (тази, установена при стартиране на транзакцията).

В допълнение към решението, дадено в другия отговор (ROLLBACK преди да започнете да четете) ето няколко решения:

Можете да изберете друго ниво на изолация на транзакциите, като ПРОЧЕТЕТЕ СЪВЪРЗАНИ , което прави вашия SELECT заявките всеки път четат нова моментна снимка.

Можете също да напуснете AutoCommit на true (настройката по подразбиране) и стартирайте свои собствени транзакции, като издадете BEGIN WORK . Това временно ще деактивира AutoCommit поведение, докато не издадете COMMIT или ROLLBACK оператор, след който всяка заявка получава своя собствена транзакция отново (или започвате друга с BEGIN WORK ).

Аз лично бих избрал последния метод, тъй като изглежда по-елегантен.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL заявка за показване на записи

  2. Колоната с автоматично увеличение на MySQL скача с 10 - защо?

  3. Индекси и първични ключове с много колони

  4. MySQL Как да ИЗБЕРЕМ данни от таблица, записана днес?

  5. Изпълнението на докер контейнер изисква поне 1 аргумент