Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Obsługa transakcji w MySQL

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Serwer MySQL zniknął - dokładnie za 60 sekund

  2. Jak usunąć bazę danych w MySQL/MariaDB?

  3. Zarządzanie użytkownikami MySQL

  4. Błąd MYSQLi:użytkownik ma już więcej niż „max_user_connections” aktywnych połączeń

  5. Zapytanie o tabele MySQL Update Inner Join