Mysql
 sql >> Database >  >> RDS >> Mysql

Come funziona ottenere l'ultimo ID di inserimento di mysql con le transazioni? + domande sulle transazioni

Per rispondere alla tua prima domanda...

Quando si utilizzano le transazioni, le query vengono eseguite normalmente per quanto riguarda la connessione. Puoi scegliere di eseguire il commit, il salvataggio di tali modifiche o il rollback, ripristinando tutte le modifiche. Considera il seguente pseudo-codice:

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.

Il numero casuale che è stato generato può essere letto prima del commit per assicurarsi che sia adatto prima di salvarlo affinché tutti lo vedano (ad es. commit e sbloccare la riga).

Se il driver PDO non funziona, considera l'utilizzo del driver mysqli. Se questa non è un'opzione, puoi sempre usare la query 'select last_insert_id() as id;' invece della funzione $this->db->insert_id().

Per rispondere alla tua seconda domanda, se stai inserendo o aggiornando dati che altri modelli aggiorneranno o leggeranno, assicurati di utilizzare le transazioni. Ad esempio, se una colonna "Numero_rimanente" è impostata su 1, può verificarsi il seguente problema.

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

L'utilizzo di transazioni nella stessa situazione produrrebbe questo risultato:

Potresti voler leggere i livelli di isolamento delle transazioni anche.

Fai attenzione al deadlock, che può verificarsi in questo caso:

Alla fine, poiché la Persona B ha probabilmente raggiunto il max_execution_time di PHP , la query corrente terminerà l'esecuzione indipendentemente da PHP, ma non verranno ricevute ulteriori query. Se si trattava di una transazione con autocommit=0, la query verrà ripristinata automaticamente quando la connessione al server PHP viene interrotta.