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

Gestione delle transazioni in MySQL

MySQL fornisce vari motori di database per gestire le query SQL. I motori più popolari sono MyISAM e InnoDB. Di questi due motori, InnoDB supporta le transazioni, il che significa che possiamo eseguire il commit e il rollback per eseguire un'operazione che coinvolge più query come una singola unità. Lo stesso non è possibile con MyISAM poiché non supporta le transazioni. InnoDB è più affidabile rispetto a MyISAM poiché utilizza i log transazionali per il ripristino automatico.

Note :MySQL sta pianificando di rimuovere completamente MyISAM poiché InnoDB ha prestazioni molto migliori rispetto a MyISAM.

Questo tutorial fornisce i dettagli per gestire le transazioni in MySQL utilizzando START TRANSACTION, COMMIT e ROLLBACK dichiarazioni. Sebbene possiamo eseguire le query SQL separatamente, che è lo scenario ideale, in molti casi è necessario assicurarsi che tutte le query specifiche per un'attività debbano avere esito positivo o negativo a causa del fallimento di una delle query. Possiamo considerare tali attività come una singola unità che coinvolge più operazioni o query per creare, aggiornare o eliminare righe. Pertanto, in un'unità transazionale con più operazioni, deve avere esito positivo o negativo.

È necessario prestare attenzione durante la gestione delle transazioni poiché ci sono alcune dichiarazioni che non possono essere annullate. Questi includono il database CREATE/DROP, la tabella CREATE/ALTER/DROP o le routine memorizzate.

Proprietà di una transazione

Di seguito sono elencate le quattro proprietà standard di una transazione. Questi sono anche chiamati ACID .

Atomicità - Garantisce che tutte le operazioni coinvolte in un'attività o unità siano completate con successo. In caso di fallimento di una delle operazioni, la transazione deve essere interrotta e tutte le operazioni precedenti devono essere ripristinate allo stato precedente. Significa che in caso di fallimento di una transazione, nessuna delle operazioni in essa coinvolte deve avere successo.

Coerenza - I dati devono essere in uno stato coerente all'inizio e alla fine della transazione per garantire che gli stati delle modifiche al database riflettano le modifiche su una transazione confermata con successo.

Isolamento - La transazione deve essere completata in isolamento nascondendo gli stati intermedi con altre transazioni. Ogni transazione deve operare in modo indipendente e trasparente tra loro.

Durata - Garantisce che le modifiche ai dati nell'ambito di una transazione persistano anche in caso di guasto del sistema. Le modifiche non devono essere annullate anche in caso di guasto del sistema.

Rendiconti delle transazioni

INIZIA LA TRANSAZIONE - Possiamo utilizzare AVVIO TRANSAZIONE o INIZIA o INIZIA A LAVORARE per avviare la transazione. Il INIZIO o INIZIA A LAVORARE sono gli alias di START TRANSACTION.

COMPETTI - In caso di successo, il COMMIT il comando deve essere emesso al termine della transazione per rendere persistenti le modifiche.

ROLLBACK - In caso di guasto, il ROLLBACK il comando deve essere emesso per ripristinare gli stati come se prima di iniziare la transazione.

IMPOSTA AUTOCOMMIT - Utilizzare l'istruzione IMPOSTA AUTOCOMMIT per disabilitare il commit automatico all'inizio della transazione e abilitarlo al termine della transazione. Utilizzare solo nel caso AVVIO TRANSAZIONE o INIZIA o INIZIA A LAVORARE non vengono utilizzati per gestire la transazione.

Esempio di trasferimento di denaro

Spiegherò la transazione utilizzando l'esempio di trasferimento di denaro intra-bancario in cui una certa somma di denaro deve essere trasferita da un conto a un altro all'interno della stessa banca.

Note :Questo esempio è solo a scopo dimostrativo e lo scenario reale sarà sicuramente diverso in base alle regole bancarie. Presuppone inoltre che le query transazionali siano gestite in modo programmatico e che i valori intermedi siano archiviati in variabili appropriate.

La sequenza delle operazioni per eseguire il trasferimento è la seguente:

  • Ottieni gli ID cliente di debito e credito dalla richiesta e archiviali in variabili.
  • Ottieni l'importo da trasferire dalla richiesta e archivialo in una variabile.
  • Avvia la transazione.
  • Ottieni il saldo del primo cliente e conservalo in una variabile.
  • Ottieni il saldo del secondo cliente e conservalo in una variabile.
  • Ripristina la transazione nel caso in cui il primo cliente abbia un saldo insufficiente.
  • Aggiungi una transazione di addebito per riflettere la detrazione dal primo account cliente.
  • Ripristino in caso di errore.
  • Aggiungi una transazione di credito per riflettere il trasferimento sul secondo account cliente.
  • Ripristino in caso di errore.
  • Registra il trasferimento.
  • Ripristino in caso di errore.
  • Aggiorna il saldo del primo cliente.
  • Ripristino in caso di errore.
  • Aggiorna il saldo del secondo cliente.
  • Ripristino in caso di errore.
  • Compila la transazione.

Di seguito sono elencate le query di esempio per eseguire la sequenza di trasferimento.

-- Start the transaction
START TRANSACTION;

-- Get balance of first customer
SELECT balance from ACCOUNT WHERE customer_id = 123124123;

-- Get balance of second customer
SELECT balance from ACCOUNT WHERE customer_id = 223124145;

-- Rollback in case of insufficient funds
ROLLBACK;

-- Add debit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(123124123, <amount>, 0, <reference>);

-- Rollback in case of failure
ROLLBACK;

-- Add credit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(223124145, <amount>, 1, <reference>);

-- Rollback in case of failure
ROLLBACK;

-- Add transfer transaction
INSERT INTO transfer(from,to,amount) VALUES(123124123, 223124145, <amount>);

-- Rollback in case of failure
ROLLBACK;

-- Update balance of first customer
UPDATE ACCOUNT SET balance = <balance - amount> WHERE customer_id = 123124123;

-- Rollback in case of failure
ROLLBACK;

-- Update balance of second customer
UPDATE ACCOUNT SET balance = <balance + amount> WHERE customer_id = 223124145;

-- Rollback in case of failure
ROLLBACK;

-- Commit the transaction
COMMIT;

Possiamo vedere chiaramente che dobbiamo tornare indietro in caso di fallimento in qualsiasi fase per tornare allo stato iniziale prima di iniziare il trasferimento per riflettere l'equilibrio effettivo di entrambi i clienti.

Ecco come possiamo gestire le transazioni in MySQL.