Una domanda in due parti:In che modo l'ultimo ID inserto di mysql funziona con le transazioni? + Domande di transazione
Nel mio script CodeIgniter, sto iniziando una transazione, poi l'inserimento di una riga, impostando l'insert_id() a una variabile PHP, l'inserimento di più righe in un'altra tabella usando il nuovo ID come chiave esterna, e poi commetto tutto.
Quindi la mia domanda è: se tutto non si impegna prima di terminare la transazione, in che modo mysql è in grado di restituire l'ultimo ID di inserimento, se non è stato inserito nulla? Il mio script funziona (quasi) perfettamente, con il nuovo ID utilizzato nelle query successive.
(Dico "quasi" perché, usando il driver mysql PDO, a volte il primo inserto che deve restituire l'insert_id() è duplicato - viene inserito due volte. Qualche idea sul perché sarebbe? ? per ottenere l'ultimo ID non accade mai se si utilizza il mysqli o il driver mysql)
ho scritto la sceneggiatura, senza transazioni, quindi devo codice che controlla per errori di MySQL lungo la strada, come ad esempio:.
if(!$this->db->insert($table, $data)) { //log message here }
In che modo questo influenza il processo mysql una volta che ho avvolto tutto il mio codice mysql in una transazione? Non sta causando alcun errore visibile (si spera non correlato al problema sopra indicato), ma dovrebbe essere rimosso?
Grazie.
Grazie per la risposta! Solo per essere sicuro di aver capito correttamente, intendi dire che se avessi avvolto tutte le query mysql in una transazione, e lo scenario che hai scritto sopra accadesse (due utenti accederanno entrambi a una pagina "vincente" allo stesso tempo), allora passare solo per una persona? Avrei bisogno di controllare se 'number_remaining' è uguale a 1 all'inizio della transazione, però, corretto? –
corretto. Per l'esempio che ho fornito, dovresti anche assicurarti che il tuo livello di isolamento sia impostato su serializzabile o che sia stato usato un "select for update" per bloccare la riga su select. Le istruzioni di aggiornamento, cancellazione e inserimento hanno un comportamento di blocco diverso a seconda del livello di isolamento. L'utilizzo di transazioni per ogni query può portare a deadlock, quindi usali quando è di vitale importanza che i tuoi dati siano aggiornati e accurati. Ho aggiornato la mia risposta per includere un esempio con transazioni abilitate. –
Grazie mille, questa è un'ottima spiegazione! Non ero a conoscenza di quelle opzioni mysql che hai menzionato. Ho ancora un paio di domande, se non ti dispiace: 1. Ho cercato 'serializable' nella documentazione di mysql, e mostra che imposta un' lock in share mode'. Questo in realtà non impedisce di selezionare la riga. Penso che "seleziona ... per l'aggiornamento" dovrebbe essere usato, corretto (blocca la lettura)? 2. In quali casi può esserci un deadlock usando le transazioni? Perché le transazioni successive non dovrebbero semplicemente aspettare il loro turno? –