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

Håndtering af transaktioner i MySQL

MySQL leverer forskellige databasemotorer til at håndtere SQL-forespørgslerne. De mest populære motorer er MyISAM og InnoDB. Ud af disse to motorer understøtter InnoDB transaktioner, hvilket betyder, at vi kan forpligte og rulle tilbage til at udføre en operation, der involverer flere forespørgsler som en enkelt enhed. Det samme er ikke muligt med MyISAM, da det ikke understøtter transaktioner. InnoDB er mere pålidelig sammenlignet med MyISAM, da den bruger transaktionslogfiler til automatisk gendannelse.

Noter :MySQL planlægger fuldstændigt at fjerne MyISAM, da InnoDB er meget bedre i ydeevne sammenlignet med MyISAM.

Denne vejledning giver detaljerne til at håndtere transaktioner i MySQL ved hjælp af START TRANSACTION, COMMIT , og TILBAGE TILBAGE udsagn. Selvom vi kan udføre SQL-forespørgslerne separat, hvilket er det ideelle scenarie, skal vi i flere tilfælde sørge for, at alle forespørgsler, der er specifikke for en opgave, enten skal lykkes eller mislykkes på grund af fejl i en af ​​forespørgslerne. Vi kan betragte sådanne opgaver som en enkelt enhed, der involverer flere operationer eller forespørgsler for at oprette, opdatere eller slette rækker. Derfor, i en transaktionsenhed med flere operationer, skal den enten lykkes eller mislykkes.

Man skal passe på, mens man håndterer transaktioner, da der er visse udsagn, der ikke kan rulles tilbage. Disse omfatter CREATE/DROP database, CREATE/ALTER/DROP tabel eller lagrede rutiner.

Egenskaber for en transaktion

Nedenfor er angivet de fire standardegenskaber for en transaktion. Disse kaldes også som SYRE .

Atomicitet - Det sikrer, at alle operationer involveret i en opgave eller enhed bliver gennemført med succes. I tilfælde af fejl i en af ​​operationerne, skal transaktionen afbrydes, og alle de tidligere operationer skal rulles tilbage til deres tidligere tilstand. Det betyder, at i tilfælde af fejl i en transaktion, må ingen af ​​de involverede operationer lykkes.

Konsistens - Data skal være i en konsistent tilstand ved starten og slutningen af ​​transaktionen for at sikre, at databasen ændrer tilstande for at afspejle ændringerne efter en vellykket gennemført transaktion.

Isolation - Transaktionen skal gennemføres isoleret og skjuler mellemtilstandene med andre transaktioner. Hver transaktion skal fungere uafhængigt og gennemsigtigt for hinanden.

Holdbarhed - Det sikrer, at ændringerne i data som en del af en transaktion fortsætter selv i tilfælde af systemfejl. Ændringerne må ikke fortrydes, selv i tilfælde af systemfejl.

Transaktionsopgørelser

START TRANSAKTION - Vi kan bruge START TRANSAKTION eller BEGIN eller BEGIN ARBEJDE for at starte transaktionen. BEGIN eller BEGIN ARBEJDE er aliasserne for START TRANSAKTION.

KOMMITTER - I tilfælde af succes, COMMIT kommandoen skal udstedes i slutningen af ​​transaktionen for at fortsætte ændringerne.

TILBAGE - I tilfælde af fejl, TILBAGE kommandoen skal udstedes for at gendanne tilstandene, som før transaktionen startes.

INDSTIL AUTOKOMMITTERING - Brug sætningen SET AUTOCOMMIT for at deaktivere auto-commit i starten af ​​transaktionen og aktivere den ved slutningen af ​​transaktionen. Brug kun i tilfælde af START TRANSAKTION eller BEGIN eller BEGIN ARBEJDE ikke bruges til at håndtere transaktionen.

Eksempel på pengeoverførsel

Jeg vil forklare transaktionen ved at bruge eksemplet med pengeoverførsel inden for bank, hvor et bestemt beløb skal overføres fra en konto til en anden konto i samme bank.

Noter :Dette eksempel er kun til demonstrationsformål, og det faktiske scenarie vil helt sikkert være anderledes baseret på bankreglerne. Det forudsætter også, at transaktionsforespørgslerne håndteres programmatisk, og at mellemværdierne gemmes i passende variabler.

Rækkefølgen af ​​operationer for at udføre overførslen er som følger:

  • Hent debet- og kreditkunde-id'erne fra anmodningen, og gem dem i variabler.
  • Få det beløb, der skal overføres fra anmodningen, og gem i en variabel.
  • Start transaktionen.
  • Opnå saldoen mellem første kunde og butik i en variabel.
  • Opnå saldoen for anden kunde og gem i en variabel.
  • Ruller transaktionen tilbage i tilfælde af, at den første kunde har utilstrækkelig saldo.
  • Tilføj en debettransaktion for at afspejle fradraget fra den første kundekonto.
  • Rulning i tilfælde af fejl.
  • Tilføj en kredittransaktion for at afspejle overførslen til den anden kundekonto.
  • Rulning i tilfælde af fejl.
  • Optag overførslen.
  • Rulning i tilfælde af fejl.
  • Opdater saldoen for den første kunde.
  • Rulning i tilfælde af fejl.
  • Opdater saldoen for anden kunde.
  • Rulning i tilfælde af fejl.
  • Bekræft transaktionen.

Nedenfor er eksempler på forespørgsler til at udføre overførselssekvensen.

-- 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 tydeligt se, at vi skal rulle tilbage i tilfælde af fejl på et hvilket som helst tidspunkt for at vende tilbage til de oprindelige tilstande, før vi starter overførslen for at afspejle den faktiske saldo for begge kunder.

Sådan kan vi håndtere transaktionerne i MySQL.


  1. Konfiguration af AlwaysOn-tilgængelighedsgrupper - Del 2

  2. 4 måder at vise alle visninger i MySQL

  3. Hvorfor får jeg java.lang.AbstractMethodError, når jeg prøver at indlæse en blob i db'en?

  4. Kombiner SQLite Count() med GROUP BY for at tilføje en "Count"-kolonne til dit resultatsæt