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.