MySQL udostępnia różne silniki baz danych do obsługi zapytań SQL. Najpopularniejsze silniki to MyISAM i InnoDB. Z tych dwóch silników InnoDB obsługuje transakcje, co oznacza, że możemy zatwierdzać i cofać, aby wykonać operację obejmującą wiele zapytań jako pojedynczą jednostkę. To samo nie jest możliwe z MyISAM, ponieważ nie obsługuje transakcji. InnoDB jest bardziej niezawodny w porównaniu z MyISAM, ponieważ wykorzystuje dzienniki transakcyjne do automatycznego odzyskiwania.
Notatki :MySQL planuje całkowicie usunąć MyISAM, ponieważ InnoDB ma znacznie lepszą wydajność w porównaniu z MyISAM.
Ten samouczek zawiera szczegóły dotyczące obsługi transakcji w MySQL za pomocą START TRANSACTION, COMMIT i COFNIĘCIE sprawozdania. Chociaż możemy wykonywać zapytania SQL oddzielnie, co jest idealnym scenariuszem, w kilku przypadkach musimy upewnić się, że wszystkie zapytania specyficzne dla zadania muszą zakończyć się powodzeniem lub niepowodzeniem z powodu niepowodzenia któregokolwiek z zapytań. Możemy traktować takie zadania jako pojedynczą jednostkę obejmującą wiele operacji lub zapytań do tworzenia, aktualizowania lub usuwania wierszy. Dlatego w jednostce transakcyjnej posiadającej wiele operacji musi się powieść lub zakończyć.
Należy zachować ostrożność podczas obsługi transakcji, ponieważ istnieją pewne stwierdzenia, których nie można wycofać. Obejmuje to bazę danych CREATE/DROP, tabelę CREATE/ALTER/DROP lub zapisane procedury.
Właściwości transakcji
Poniżej wymienione są cztery standardowe właściwości transakcji. Są one również nazywane ACID .
Atomowość - Zapewnia pomyślne zakończenie wszystkich operacji związanych z zadaniem lub jednostką. W przypadku niepowodzenia jednej z operacji, transakcja musi zostać przerwana, a wszystkie poprzednie operacje muszą zostać przywrócone do poprzedniego stanu. Oznacza to, że w przypadku niepowodzenia transakcji żadna z zaangażowanych w nią operacji nie może się powieść.
Spójność - Dane muszą być w spójnym stanie na początku i na końcu transakcji, aby zapewnić, że stan bazy danych zmieni się, aby odzwierciedlić zmiany po pomyślnie zatwierdzonej transakcji.
Izolacja - Transakcja musi być wykonana w izolacji, ukrywając stany pośrednie przed innymi transakcjami. Każda transakcja musi działać niezależnie i przejrzyście dla siebie.
Trwałość - Zapewnia zachowanie zmian danych w ramach transakcji nawet w przypadku awarii systemu. Zmiany nie mogą zostać cofnięte nawet w przypadku awarii systemu.
Wyciągi transakcji
ROZPOCZNIJ TRANSAKCJĘ - Możemy użyć ROZPOCZNIJ TRANSAKCJĘ lub POCZĄTEK lub ROZPOCZNIJ PRACĘ aby rozpocząć transakcję. POCZĄTEK lub ROZPOCZNIJ PRACĘ to aliasy ROZPOCZNIJ TRANSAKCJĘ.
POTWIERDZENIE - W przypadku sukcesu, POTWIERDZENIE polecenie musi zostać wydane na końcu transakcji, aby zachować zmiany.
COFANIE - W przypadku jakiejkolwiek awarii, ROLLBACK polecenie musi zostać wydane, aby przywrócić stany tak, jak przed rozpoczęciem transakcji.
USTAW AUTOCOMMIT - Użyj stwierdzenia USTAW AUTOCOMMIT aby wyłączyć automatyczne zatwierdzanie na początku transakcji i włączyć je na końcu transakcji. Używaj tylko w przypadku ROZPOCZNIJ TRANSAKCJĘ lub POCZĄTEK lub ROZPOCZNIJ PRACĘ nie są wykorzystywane do obsługi transakcji.
Przykład przelewu pieniędzy
Wyjaśnię transakcję na przykładzie przelewu wewnątrzbankowego, w którym określona kwota pieniędzy musi zostać przelana z jednego konta na drugie w tym samym banku.
Notatki :Ten przykład służy tylko do celów demonstracyjnych, a rzeczywisty scenariusz na pewno będzie się różnił w oparciu o zasady bankowe. Zakłada również, że zapytania transakcyjne są obsługiwane programowo, a wartości pośrednie są przechowywane w odpowiednich zmiennych.
Sekwencja operacji do wykonania transferu jest następująca:
- Uzyskaj identyfikatory klientów debetowych i kredytowych z żądania i przechowuj je w zmiennych.
- Uzyskaj kwotę do przesłania z żądania i zapisz w zmiennej.
- Rozpocznij transakcję.
- Uzyskaj saldo pierwszego klienta i zapisz w zmiennej.
- Uzyskaj saldo drugiego klienta i zapisz w zmiennej.
- Wycofaj transakcję w przypadku, gdy pierwszy klient ma niewystarczające saldo.
- Dodaj transakcję debetową, aby odzwierciedlić potrącenie z pierwszego konta klienta.
- Wycofanie w przypadku awarii.
- Dodaj transakcję kredytową, aby odzwierciedlić przelew na drugie konto klienta.
- Wycofanie w przypadku awarii.
- Nagraj transfer.
- Wycofanie w przypadku awarii.
- Zaktualizuj saldo pierwszego klienta.
- Wycofanie w przypadku awarii.
- Zaktualizuj saldo drugiego klienta.
- Wycofanie w przypadku awarii.
- Zatwierdź transakcję.
Poniżej wymienione są przykładowe zapytania do wykonania sekwencji transferu.
-- 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;
Widzimy wyraźnie, że musimy wycofać się w przypadku niepowodzenia na dowolnym etapie, aby powrócić do stanów początkowych przed rozpoczęciem transferu, aby odzwierciedlić rzeczywiste saldo obu klientów.
W ten sposób możemy obsługiwać transakcje w MySQL.