In InnoDB, non è necessario avviare o terminare in modo esplicito le transazioni per singole query se non è stata modificata l'impostazione predefinita di autocommit, che è "on". Se l'autocommit è attivo, InnoDB racchiude automaticamente ogni singola query SQL in una transazione, che è l'equivalente di START TRANSACTION; query; COMMIT;
.
Se utilizzi esplicitamente START TRANSACTION
in InnoDB con autocommit attivo, quindi tutte le query eseguite dopo un START TRANSACTION
l'istruzione verrà eseguita o tutte falliranno. Questo è utile in ambienti bancari, ad esempio:se sto trasferendo $ 500 sul tuo conto bancario, quell'operazione dovrebbe avere successo solo se la somma è stata sottratta dal mio conto bancario e aggiunta al tuo. Quindi, in questo caso, eseguiresti qualcosa come
START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;
Ciò garantisce che entrambe le query vengano eseguite correttamente o nessuna, ma non solo una. Questo post ha qualcosa in più su quando dovresti usare le transazioni.
In InnoDB, molto raramente dovrai bloccare intere tabelle; InnoDB, a differenza di MyISAM, supporta il blocco a livello di riga. Ciò significa che i client non devono bloccare l'intera tabella, costringendo altri client ad attendere. I client devono bloccare solo le righe di cui hanno effettivamente bisogno, consentendo ad altri client di continuare ad accedere alle righe di cui hanno bisogno.
Puoi leggere ulteriori informazioni sulle transazioni InnoDB qui . Le tue domande sul deadlock trovano risposta nelle sezioni 14.2.8.8 e 14.2.8.9 dei documenti. Se una query fallisce, il tuo driver MySQL restituirà un messaggio di errore indicando il motivo; la tua app dovrebbe quindi inviare nuovamente le query, se necessario.
Infine, nel tuo codice di esempio, hai usato mysql_query
. Se stai scrivendo un nuovo codice, smetti di usare il vecchio, lento e deprecato mysql_
libreria per PHP e usa mysqli_
o invece DOP :)