sql >> Database >  >> RDS >> Mysql

Transacties afhandelen in MySQL

MySQL biedt verschillende database-engines om de SQL-query's af te handelen. De meest populaire engines zijn MyISAM en InnoDB. Van deze twee engines ondersteunt InnoDB transacties, wat betekent dat we kunnen committen en terugdraaien om een ​​bewerking met meerdere query's als een enkele eenheid uit te voeren. Hetzelfde is niet mogelijk met MyISAM omdat het geen transacties ondersteunt. InnoDB is betrouwbaarder in vergelijking met MyISAM omdat het transactielogboeken gebruikt voor automatisch herstel.

Opmerkingen :MySQL is van plan om MyISAM volledig te verwijderen, aangezien InnoDB veel beter presteert in vergelijking met MyISAM.

Deze tutorial biedt de details voor het afhandelen van transacties in MySQL met behulp van START TRANSACTION, COMMIT , en ROLLBACK verklaringen. Hoewel we de SQL-query's afzonderlijk kunnen uitvoeren, wat het ideale scenario is, moeten we er in verschillende gevallen voor zorgen dat alle query's die specifiek zijn voor een taak, slagen of mislukken vanwege het mislukken van een van de query's. We kunnen dergelijke taken beschouwen als een enkele eenheid met meerdere bewerkingen of query's om rijen te maken, bij te werken of te verwijderen. Daarom moet het in een transactie-eenheid met meerdere bewerkingen slagen of mislukken.

Men moet voorzichtig zijn bij het afhandelen van transacties, aangezien er bepaalde verklaringen zijn die niet kunnen worden teruggedraaid. Deze omvatten CREATE/DROP-database, CREATE/ALTER/DROP-tabel of opgeslagen routines.

Eigenschappen van een transactie

Hieronder vindt u de vier standaardeigenschappen van een transactie. Deze worden ook wel ACID . genoemd .

Atomiciteit - Het zorgt ervoor dat alle operaties die betrokken zijn bij een taak of eenheid met succes worden voltooid. Als een van de bewerkingen mislukt, moet de transactie worden afgebroken en moeten alle eerdere bewerkingen worden teruggedraaid naar hun vorige status. Het betekent dat in het geval dat een transactie mislukt, geen van de betrokken operaties mag slagen.

Consistentie - Gegevens moeten aan het begin en het einde van de transactie in een consistente staat zijn om ervoor te zorgen dat de database van status verandert om de wijzigingen weer te geven bij een geslaagde vastgelegde transactie.

Isolatie - De transactie moet afzonderlijk worden voltooid, waarbij de tussenliggende toestanden met andere transacties worden verborgen. Elke transactie moet onafhankelijk en transparant voor elkaar zijn.

Duurzaamheid - Het zorgt ervoor dat de wijzigingen in gegevens als onderdeel van een transactie blijven bestaan, zelfs in het geval van een systeemstoring. De wijzigingen mogen niet ongedaan worden gemaakt, zelfs niet in het geval van een systeemstoring.

Transactieoverzichten

BEGIN TRANSACTIE - We kunnen TRANSACTIE STARTEN . gebruiken of BEGIN of BEGIN MET WERK om de transactie te starten. De BEGIN of BEGIN MET WERK zijn de aliassen van START TRANSACTION.

COMMIT - In geval van succes, de COMMIT opdracht moet worden gegeven aan het einde van de transactie om de wijzigingen voort te zetten.

ROLLBACK - In het geval van een storing, de ROLLBACK opdracht moet worden gegeven om de toestanden te herstellen alsof vóór het starten van de transactie.

AUTOMATISCH INSTELLEN - Gebruik de instructie SET AUTOCOMMIT om automatisch vastleggen aan het begin van de transactie uit te schakelen en aan het einde van de transactie in te schakelen. Alleen gebruiken in het geval TRANSACTIE BEGINNEN of BEGIN of BEGIN MET WERK worden niet gebruikt om de transactie af te handelen.

Voorbeeld van geldoverdracht

Ik zal de transactie uitleggen aan de hand van het voorbeeld van een intrabancaire geldoverdracht waarbij een bepaald bedrag van de ene rekening naar een andere rekening binnen dezelfde bank moet worden overgemaakt.

Opmerkingen :Dit voorbeeld is alleen voor demonstratiedoeleinden en het werkelijke scenario zal zeker anders zijn op basis van de bankregels. Het gaat er ook van uit dat de transactiequery's programmatisch worden afgehandeld en dat de tussenliggende waarden worden opgeslagen in de juiste variabelen.

De volgorde van handelingen om de overdracht uit te voeren is als volgt:

  • Verkrijg de debet- en credit-klant-ID's van het verzoek en sla op in variabelen.
  • Verkrijg het over te dragen bedrag van het verzoek en sla op in een variabele.
  • Start de transactie.
  • Het saldo van de eerste klant verkrijgen en opslaan in een variabele.
  • Het saldo van de tweede klant verkrijgen en opslaan in een variabele.
  • De transactie terugdraaien als de eerste klant onvoldoende saldo heeft.
  • Voeg een debettransactie toe om de afschrijving van de eerste klantrekening weer te geven.
  • Terugdraaien in geval van storing.
  • Voeg een krediettransactie toe om de overboeking naar de tweede klantaccount weer te geven.
  • Terugdraaien in geval van storing.
  • Registreer de overdracht.
  • Terugdraaien in geval van storing.
  • Werk het saldo van de eerste klant bij.
  • Terugdraaien in geval van storing.
  • Het saldo van de tweede klant bijwerken.
  • Terugdraaien in geval van storing.
  • Voer de transactie uit.

Hieronder staan ​​de voorbeeldquery's om de overdrachtvolgorde uit te voeren.

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

We kunnen duidelijk zien dat we moeten terugdraaien in het geval van een mislukking in elk stadium om terug te keren naar de oorspronkelijke toestand voordat de overdracht wordt gestart om het werkelijke saldo van beide klanten weer te geven.

Zo kunnen we de transacties in MySQL afhandelen.


  1. toegang krijgen tot een kolomaliassen in de waar-clausule in postgresql

  2. DECOMPOSE() Functie in Oracle

  3. Zou het tijdens het uitvoeren van PITR mogelijk zijn om te pauzeren/hervatten in PostgreSQL?

  4. Sjabloonpatronen en -modificaties voor datum-/tijdopmaak in PostgreSQL