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.