Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Uchwyt bazy danych DBI z funkcją AutoCommit ustawioną na 0 nie zwraca poprawnych danych za pomocą SELECT?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sprawdź, czy wartość istnieje w mysql

  2. Czy mogę przenieść tabelę MySQL na drugi dysk?

  3. Automatyczne zwiększanie varchar w zapytaniu sql

  4. Czy w MySQL występuje operacja all (ustaw podział?) wbudowana?

  5. Jak uzyskać tylko tabele, a nie widoki za pomocą SHOW TABLES?