sql >> Databáze >  >> RDS >> Mysql

Popisovač databáze DBI s AutoCommit nastaveným na 0 nevrací správná data pomocí SELECT?

Předpokládám, že používáte tabulky InnoDB a ne tabulky MyISAM. Jak je popsáno v InnoDB transakční model , vše vaše dotazy (včetně SELECT) probíhají v rámci transakce.

Když AutoCommit je zapnutá, pro každý dotaz je spuštěna transakce a pokud je úspěšná, je implicitně potvrzena (pokud selže, chování se může lišit, ale je zaručeno, že transakce skončí). Implicitní odevzdání můžete vidět v binlogu MySQL. Nastavením AutoCommit na false, jste povinni řídit transakce sami.

Výchozí úroveň izolace transakcí je OPAKOVATELNÉ PŘEČTĚNÍ , což znamená, že všechny SELECT dotazy budou číst stejný snímek (ten vytvořený při zahájení transakce).

Kromě řešení uvedeného v druhé odpovědi (ROLLBACK než začnete číst) zde je několik řešení:

Můžete si vybrat jinou úroveň izolace transakcí, například PŘEČTĚTE ODPOVĚDĚNO , což znamená, že SELECT dotazy čtou pokaždé nový snímek.

Můžete také opustit AutoCommit na hodnotu true (výchozí nastavení) a začněte své vlastní transakce zadáním příkazu BEGIN WORK . Tím dočasně deaktivujete AutoCommit chování, dokud nevydáte COMMIT nebo ROLLBACK příkaz, po kterém každý dotaz znovu získá svou vlastní transakci (nebo začnete další s BEGIN WORK ).

Osobně bych zvolil druhý způsob, protože se zdá elegantnější.



  1. Podmíněný příkaz INSERT INTO v postgresu

  2. PHP Vyberte z MySQL, kde datum je 7 dní v budoucnosti

  3. Duplikovat řádky v tabulce primárního klíče.

  4. Ověření hesla Postgres se nezdařilo