sql >> Databasteknik >  >> RDS >> Mysql

Hantera transaktioner i MySQL

MySQL tillhandahåller olika databasmotorer för att hantera SQL-frågor. De mest populära motorerna är MyISAM och InnoDB. Av dessa två motorer stöder InnoDB transaktioner vilket innebär att vi kan commit och rollback för att utföra en operation som involverar flera frågor som en enda enhet. Detsamma är inte möjligt med MyISAM eftersom det inte stöder transaktioner. InnoDB är mer pålitlig jämfört med MyISAM eftersom den använder transaktionsloggar för automatisk återställning.

Anteckningar :MySQL planerar att helt ta bort MyISAM eftersom InnoDB är mycket bättre i prestanda jämfört med MyISAM.

Denna handledning ger information om hur du hanterar transaktioner i MySQL med START TRANSACTION, COMMIT och ÅTERBAKA uttalanden. Även om vi kan köra SQL-frågorna separat, vilket är det idealiska scenariot, måste vi i flera fall se till att alla frågor som är specifika för en uppgift antingen måste lyckas eller misslyckas på grund av misslyckande i någon av frågorna. Vi kan betrakta sådana uppgifter som en enda enhet som involverar flera operationer eller frågor för att skapa, uppdatera eller ta bort rader. I en transaktionsenhet som har flera operationer måste den därför antingen lyckas eller misslyckas.

Man måste vara försiktig när man hanterar transaktioner eftersom det finns vissa uttalanden som inte kan återställas. Dessa inkluderar CREATE/DROP-databas, CREATE/ALTER/DROP-tabell eller lagrade rutiner.

Egenskaper för en transaktion

Nedan listas de fyra standardegenskaperna för en transaktion. Dessa kallas även SYRA .

Atomicitet – Det säkerställer att alla operationer som är involverade i en uppgift eller enhet slutförs framgångsrikt. Om någon av operationerna misslyckas måste transaktionen avbrytas och alla tidigare operationer måste återställas till sitt tidigare tillstånd. Det betyder att om en transaktion misslyckas, måste ingen av operationerna som är involverade i den lyckas.

Konsistens - Data måste vara i ett konsekvent tillstånd i början och slutet av transaktionen för att säkerställa att databasen ändrar tillstånd för att återspegla ändringarna efter en framgångsrik genomförd transaktion.

Isolering - Transaktionen måste slutföras isolerat och dölja mellanliggande tillstånd med andra transaktioner. Varje transaktion måste fungera oberoende och transparent för varandra.

Hållbarhet – Det säkerställer att förändringarna i data som en del av en transaktion kvarstår även i händelse av ett systemfel. Ändringarna får inte ångras även vid ett systemfel.

Transaktionsutdrag

STARTA TRANSAKTION – Vi kan använda START TRANSACTION eller BÖRJAN eller BÖRJA ARBETA för att starta transaktionen. BEGIN eller BÖRJA ARBETA är aliasen för STARTA TRANSACTION.

ÅTGÄRDER - Vid framgång, KOMMIT kommandot måste utfärdas i slutet av transaktionen för att ändringarna ska fortsätta.

ÅTERSTÄLLNING - Vid eventuella fel, ÅTERSTÄLLNING kommandot måste utfärdas för att återställa tillstånden som innan transaktionen påbörjas.

STÄLL IN AUTOCOMMIT - Använd satsen SET AUTOCOMMIT för att inaktivera auto-commit i början av transaktionen och aktivera det i slutet av transaktionen. Använd endast om STARTA TRANSAKTION eller BÖRJAN eller BÖRJA ARBETA används inte för att hantera transaktionen.

Exempel på pengaöverföring

Jag kommer att förklara transaktionen med hjälp av exemplet med pengaöverföring inom bank där en viss summa pengar måste överföras från ett konto till ett annat konto inom samma bank.

Anteckningar :Det här exemplet är bara för demonstrationssyfte och det faktiska scenariot kommer definitivt att vara annorlunda baserat på bankreglerna. Det förutsätter också att transaktionsfrågorna hanteras programmatiskt och att mellanvärdena lagras i lämpliga variabler.

Sekvensen av operationer för att utföra överföringen är som följer:

  • Hämta debet- och kreditkund-ID från begäran och lagra i variabler.
  • Hämta beloppet som ska överföras från begäran och lagra i en variabel.
  • Starta transaktionen.
  • Hämta balansen mellan första kund och lagra i en variabel.
  • Hämta balansen för andra kund och lagra i en variabel.
  • Återställ transaktionen om den första kunden har otillräckligt saldo.
  • Lägg till en debiteringstransaktion för att återspegla avdraget från det första kundkontot.
  • Återställ vid fel.
  • Lägg till en kredittransaktion för att återspegla överföringen till det andra kundkontot.
  • Återställ vid fel.
  • Spela in överföringen.
  • Återställ vid fel.
  • Uppdatera saldot för första kunden.
  • Återställ vid fel.
  • Uppdatera saldot för den andra kunden.
  • Återställ vid fel.
  • Beslut transaktionen.

Nedan nämns exempelfrågorna för att utföra överföringssekvensen.

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

Vi kan tydligt se att vi måste återställa i händelse av misslyckande i något skede för att återgå till initiala tillstånd innan överföringen påbörjas för att återspegla det faktiska saldot för båda kunderna.

Så här kan vi hantera transaktionerna i MySQL.


  1. Gruppering i intervall på 5 minuter inom ett tidsintervall

  2. Oracle:spelar kolumnordningen någon roll i ett index?

  3. Hur begränsar jag antalet rader som returneras av en Oracle-fråga efter beställning?

  4. Inaktivera alla tabellbegränsningar i Oracle