Odpověď na vaši první otázku...
Při použití transakcí se vaše dotazy provádějí normálně, pokud jde o vaše připojení. Můžete se rozhodnout potvrdit, uložit tyto změny nebo vrátit zpět všechny změny. Zvažte následující pseudokód:
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.
Náhodné číslo, které bylo vygenerováno, lze přečíst před odevzdáním, abyste se ujistili, že je vhodné před jeho uložením, aby je mohl vidět každý (např. odevzdat a odemknout řádek).
Pokud ovladač PDO nefunguje, zvažte použití ovladače mysqli. Pokud to není možnost, můžete vždy použít dotaz 'select last_insert_id() as id;' spíše než funkce $this->db->insert_id().
Chcete-li odpovědět na vaši druhou otázku, pokud vkládáte nebo aktualizujete data, která budou aktualizovat nebo číst jiné modely, nezapomeňte použít transakce. Pokud je například sloupec 'Number_remaining' nastaven na 1, může nastat následující problém.
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
Použití transakcí ve stejné situaci by přineslo tento výsledek:
Možná si budete chtít přečíst úrovně izolace transakcí také.
Dávejte pozor na zablokování, ke kterému může v tomto případě dojít:
Na konci, protože osoba B pravděpodobně dosáhla max_execution_time
PHP , aktuální dotaz se dokončí nezávisle na PHP, ale nebudou přijímány žádné další dotazy. Pokud se jednalo o transakci s autocommit=0, dotaz se po přerušení spojení s vaším PHP serverem automaticky vrátí zpět.