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

Jak získávání posledního ID vložení mysql funguje s transakcemi? + transakční otázky

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.




  1. Jak deklarovat místní proměnné v postgresql?

  2. 11 funkcí pro získání dne, měsíce a roku z data v MariaDB

  3. symfony 1.4 propel:build-all nefunguje na Mysql 5.5

  4. Je možné vyhledat celé zadané slovo ve Fulltextovém vyhledávání mysql