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

Jak pobranie ostatniego identyfikatora wstawiania mysql działa z transakcjami? + pytania transakcyjne

Aby odpowiedzieć na Twoje pierwsze pytanie...

Podczas korzystania z transakcji Twoje zapytania są wykonywane normalnie, jeśli chodzi o Twoje połączenie. Możesz wybrać zatwierdzenie, zapisanie tych zmian lub wycofanie, cofnięcie wszystkich zmian. Rozważ następujący pseudokod:

insert into number(Random_number) values (rand()); 
select Random_number from number where Number_id=Last_insert_id();

//php

if($num < 1)
   $this->db->query('rollback;'); // This number is too depressing.
else
   $this->db->query('commit;'); // This number is just right.

Wygenerowaną losową liczbę można odczytać przed zatwierdzeniem, aby upewnić się, że jest odpowiednia przed zapisaniem, aby wszyscy mogli ją zobaczyć (np. Zatwierdź i odblokuj wiersz).

Jeśli sterownik PDO nie działa, rozważ użycie sterownika mysqli. Jeśli to nie jest opcja, zawsze możesz użyć zapytania 'select last_insert_id() jako id;' zamiast funkcji $this->db->insert_id().

Aby odpowiedzieć na drugie pytanie, jeśli wstawiasz lub aktualizujesz dane, które inne modele będą aktualizować lub odczytywać, upewnij się, że korzystasz z transakcji. Na przykład, jeśli kolumna „Number_remaining” jest ustawiona na 1, może wystąpić następujący problem.

Person A reads 1
Person B reads 1
Person A wins $1000!
Person A updates 1 to be 0
Person B wins $1000!
Person B updates 0 to be 0

Użycie transakcji w tej samej sytuacji dałoby następujący wynik:

Możesz przeczytać o poziomach izolacji transakcji również.

Uważaj na zakleszczenie, które może wystąpić w takim przypadku:

Na koniec, ponieważ osoba B prawdopodobnie osiągnęła max_execution_time PHP , bieżące zapytanie zakończy wykonywanie niezależnie od PHP, ale żadne dalsze zapytania nie zostaną odebrane. Jeśli była to transakcja z autocommit=0, zapytanie zostanie automatycznie wycofane, gdy połączenie z serwerem PHP zostanie zerwane.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. InnoDB:nie można zablokować ./ibdata1 błąd:35

  2. Zapytanie przestawne MySQL

  3. Jak zaimportować dane CSV do bazy danych MYSQL za pomocą PHP CodeIgniter?

  4. Błąd w MySQL podczas ustawiania domyślnej wartości DATE lub DATETIME

  5. Jak zatrzymać uruchomione zapytanie mysql