sql >> Databáze >  >> RDS >> Mysql

Zpracování transakcí v MySQL

MySQL poskytuje různé databázové stroje pro zpracování SQL dotazů. Nejoblíbenější motory jsou MyISAM a InnoDB. Z těchto dvou motorů InnoDB podporuje transakce, což znamená, že se můžeme zavázat a vrátit zpět k provedení operace zahrnující více dotazů jako jeden celek. Totéž není možné s MyISAM, protože nepodporuje transakce. InnoDB je spolehlivější ve srovnání s MyISAM, protože používá transakční protokoly pro automatické obnovení.

Poznámky :MySQL plánuje úplné odstranění MyISAM, protože InnoDB je ve srovnání s MyISAM mnohem lepší z hlediska výkonu.

Tento tutoriál poskytuje podrobnosti pro zpracování transakcí v MySQL pomocí START TRANSACTION, COMMIT a ROLLBACK prohlášení. I když můžeme SQL dotazy provádět samostatně, což je ideální scénář, v několika případech se musíme ujistit, že všechny dotazy specifické pro danou úlohu musí být buď úspěšné, nebo selžou kvůli selhání některého z dotazů. Takové úlohy můžeme považovat za jednu jednotku zahrnující více operací nebo dotazů k vytvoření, aktualizaci nebo odstranění řádků. V transakční jednotce s více operacemi tedy musí buď uspět, nebo selhat.

Při zpracování transakcí je třeba být opatrní, protože existují určité příkazy, které nelze vrátit zpět. Patří sem CREATE/DROP databáze, CREATE/ALTER/DROP tabulky nebo uložené rutiny.

Vlastnosti transakce

Níže jsou uvedeny čtyři standardní vlastnosti transakce. Ty se také nazývají KYSELINA .

Atomicita - Zajišťuje, že všechny operace zapojené do úkolu nebo jednotky jsou úspěšně dokončeny. V případě selhání některé z operací musí být transakce přerušena a všechny předchozí operace musí být vráceny zpět do původního stavu. To znamená, že v případě selhání transakce nesmí být úspěšná žádná z operací, které jsou v ní obsaženy.

Konzistence - Data musí být na začátku a na konci transakce v konzistentním stavu, aby bylo zajištěno, že databáze změní stavy tak, aby odrážely změny po úspěšně potvrzené transakci.

Izolace - Transakce musí být dokončena izolovaně a skrýt mezistavy s ostatními transakcemi. Každá transakce musí fungovat nezávisle a vzájemně transparentně.

Trvalost - Zajišťuje, že změny v datech v rámci transakce přetrvají i v případě selhání systému. Změny se nesmí vrátit zpět ani v případě selhání systému.

Výpisy transakcí

ZAČÍT TRANSAKCI - Můžeme použít ZAČÍT TRANSAKCI nebo BEGIN nebo ZAČNĚTE PRÁCI pro zahájení transakce. BEGIN nebo ZAČNĚTE PRÁCI jsou aliasy ZAČÍT TRANSAKCI.

POTVRDIT - V případě úspěchu COMMIT příkaz musí být vydán na konci transakce, aby změny zůstaly zachovány.

ROLLBACK - V případě jakéhokoli selhání, ROLLBACK musí být vydán příkaz k obnovení stavů jako před zahájením transakce.

NASTAVIT AUTOMATICKÉ ZPRÁVY - Použijte příkaz SET AUTOCOMMIT deaktivovat automatické potvrzení na začátku transakce a povolit jej na konci transakce. Používejte pouze v případě, že ZAČÁTE TRANSAKCI nebo BEGIN nebo ZAČNĚTE PRÁCI se nepoužívají ke zpracování transakce.

Příklad převodu peněz

Transakci vysvětlím na příkladu vnitrobankovního převodu peněz, ve kterém musí být určitá částka peněz převedena z jednoho účtu na druhý účet v téže bance.

Poznámky :Tento příklad je pouze pro demonstrační účely a skutečný scénář se bude určitě lišit podle bankovních pravidel. Také předpokládá, že transakční dotazy jsou zpracovávány programově a mezihodnoty jsou uloženy ve vhodných proměnných.

Pořadí operací pro provedení přenosu je následující:

  • Získejte debetní a kreditní čísla zákazníků z požadavku a uložte je do proměnných.
  • Získejte částku, která má být převedena z požadavku, a uložte ji do proměnné.
  • Zahajte transakci.
  • Získejte zůstatek prvního zákazníka a uložte jej do proměnné.
  • Získejte zůstatek druhého zákazníka a uložte jej do proměnné.
  • Vrácení transakce v případě, že první zákazník nemá dostatečný zůstatek.
  • Přidejte debetní transakci, která odráží srážku z účtu prvního zákazníka.
  • Vrácení zpět v případě selhání.
  • Přidejte kreditní transakci, která odráží převod na druhý zákaznický účet.
  • Vrácení zpět v případě selhání.
  • Zaznamenejte přenos.
  • Vrácení zpět v případě selhání.
  • Aktualizujte zůstatek prvního zákazníka.
  • Vrácení zpět v případě selhání.
  • Aktualizujte zůstatek druhého zákazníka.
  • Vrácení zpět v případě selhání.
  • Potvrdit transakci.

Níže jsou uvedeny ukázkové dotazy pro provedení přenosové sekvence.

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

Jasně vidíme, že v případě selhání v jakékoli fázi musíme vrátit zpět do původního stavu před zahájením převodu, aby odrážel skutečný zůstatek obou zákazníků.

Takto můžeme zpracovávat transakce v MySQL.


  1. order by newid() - jak to funguje?

  2. Kompilace zapisovatelného rozšíření mongo_fdw v binárním formátu instalace PostgreSQL.

  3. PHP a mySQL:Rok 2038 Chyba:Co to je? jak to vyřešit?

  4. Monitorování změn tabulky v Oracle