Mysql
 sql >> Base de données >  >> RDS >> Mysql

Gestion des transactions dans MySQL

MySQL fournit divers moteurs de base de données pour gérer les requêtes SQL. Les moteurs les plus populaires sont MyISAM et InnoDB. Sur ces deux moteurs, InnoDB prend en charge les transactions, ce qui signifie que nous pouvons valider et annuler pour effectuer une opération impliquant plusieurs requêtes en une seule unité. La même chose n'est pas possible avec MyISAM car il ne prend pas en charge les transactions. InnoDB est plus fiable que MyISAM car il utilise des journaux transactionnels pour la récupération automatique.

Remarques  :MySQL prévoit de supprimer complètement MyISAM car InnoDB offre de bien meilleures performances que MyISAM.

Ce tutoriel fournit les détails pour gérer les transactions dans MySQL en utilisant START TRANSACTION, COMMIT , et ROLLBACK déclarations. Bien que nous puissions exécuter les requêtes SQL séparément, ce qui est le scénario idéal, dans plusieurs cas, nous devons nous assurer que toutes les requêtes spécifiques à une tâche doivent réussir ou échouer en raison de l'échec de l'une ou l'autre des requêtes. Nous pouvons considérer ces tâches comme une seule unité impliquant plusieurs opérations ou requêtes pour créer, mettre à jour ou supprimer des lignes. Par conséquent, dans une unité transactionnelle comportant plusieurs opérations, elle doit réussir ou échouer.

Il faut faire attention lors du traitement des transactions car certaines instructions ne peuvent pas être annulées. Cela inclut la base de données CREATE/DROP, la table CREATE/ALTER/DROP ou les routines stockées.

Propriétés d'une transaction

Vous trouverez ci-dessous les quatre propriétés standard d'une transaction. Ceux-ci sont également appelés ACIDE .

Anomicité - Il garantit que toutes les opérations impliquées dans une tâche ou une unité sont terminées avec succès. En cas d'échec de l'une des opérations, la transaction doit être abandonnée et toutes les opérations précédentes doivent être restaurées à leur état antérieur. Cela signifie qu'en cas d'échec d'une transaction, aucune des opérations impliquées ne doit réussir.

Cohérence - Les données doivent être dans un état cohérent au début et à la fin de la transaction pour garantir que la base de données change d'état pour refléter les modifications lors d'une transaction validée avec succès.

Isolement - La transaction doit être effectuée de manière isolée en masquant les états intermédiaires avec d'autres transactions. Chaque transaction doit fonctionner de manière indépendante et transparente les unes par rapport aux autres.

Durabilité - Il garantit que les modifications des données dans le cadre d'une transaction persistent même en cas de défaillance du système. Les modifications ne doivent pas être annulées même en cas de défaillance du système.

Relevés de transaction

COMMENCER LA TRANSACTION - Nous pouvons utiliser START TRANSACTION ou COMMENCER ou COMMENCER LE TRAVAIL pour démarrer la transaction. Le COMMENCER ou COMMENCER LE TRAVAIL sont les alias de START TRANSACTION.

ENGAGER - En cas de succès, le COMMIT La commande doit être émise à la fin de la transaction pour conserver les modifications.

ROLLBACK - En cas d'échec, le ROLLBACK La commande doit être émise pour restaurer les états comme avant le démarrage de la transaction.

RÉGLER L'AUTOCOMMIT - Utilisez l'instruction SET AUTOCOMMIT pour désactiver la validation automatique au début de la transaction et l'activer à la fin de la transaction. À n'utiliser qu'en cas de START TRANSACTION ou COMMENCER ou COMMENCER LE TRAVAIL ne sont pas utilisés pour gérer la transaction.

Exemple de transfert d'argent

Je vais expliquer la transaction en utilisant l'exemple de transfert d'argent intra-bancaire dans lequel une certaine somme d'argent doit être transférée d'un compte à un autre compte au sein de la même banque.

Remarques :Cet exemple est juste à des fins de démonstration et le scénario réel sera certainement différent en fonction des règles bancaires. Il suppose également que les requêtes transactionnelles sont gérées par programme et que les valeurs intermédiaires sont stockées dans des variables appropriées.

La séquence d'opérations pour effectuer le transfert est la suivante :

  • Obtenez les identifiants des clients débiteurs et créditeurs à partir de la demande et stockez-les dans des variables.
  • Obtenez le montant à transférer à partir de la requête et stockez-le dans une variable.
  • Démarrez la transaction.
  • Obtenez le solde du premier client et enregistrez-le dans une variable.
  • Obtenez le solde du deuxième client et enregistrez-le dans une variable.
  • Annuler la transaction au cas où le premier client aurait un solde insuffisant.
  • Ajouter une transaction de débit pour refléter la déduction du premier compte client.
  • Annulation en cas d'échec.
  • Ajoutez une transaction de crédit pour refléter le transfert vers le deuxième compte client.
  • Annulation en cas d'échec.
  • Enregistrer le transfert.
  • Annulation en cas d'échec.
  • Mettre à jour le solde du premier client.
  • Annulation en cas d'échec.
  • Mettre à jour le solde du deuxième client.
  • Annulation en cas d'échec.
  • Valider la transaction.

Vous trouverez ci-dessous des exemples de requêtes pour exécuter la séquence de transfert.

-- 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;

Nous pouvons clairement voir que nous devons revenir en arrière en cas d'échec à n'importe quelle étape pour revenir aux états initiaux avant de commencer le transfert afin de refléter le solde réel des deux clients.

C'est ainsi que nous pouvons gérer les transactions dans MySQL.