Poziom izolacji transakcji
Poziom izolacji transakcji wpływa bezpośrednio na zachowanie się transakcji. Zmiana poziomu izolacji może prowadzić do zupełnie różnych wyników poleceń SQL.
Poziom izolacji transakcji oznacza jak ''szczelnie'' jest zaizolowana tranasakcja i jakiego rodzaju izolacja jest skojarzona z zapytaniami wewnątrz transakcji. Można wybrać jeden z czterech poziomów izolacji (wymienionych poniżej w kolejności rosnącej szczelności izolacji).
- READ UNCOMMITTED
Ustawienie takiego poziomu transakcji powoduje dopuszczenie tzw. ''dirty reads'', tzn. że niepotwierdzone poleceniem COMMIT efekty poleceń z jednej transakcji są widoczne z poziomu drugiej transakcji. - READ COMMITTED
Potwierdzone poleceniem COMMIT zmiany danych w tablicach są widoczne z poziomu innych transakcji. Oznacza to, że identyczne polecenia w obrębie tej samej transakcji mogą zwrócić zupełnie inne wyniki. W niektórych systemach baz danych jest to domyślny sposób izolacji transakcji. - REPEATABLE READ
Jest to domyślny sposób izolacji transakcji dla tablic typu InnoDB. W obrębie transakcji wszystkie zapytania są spójne. - SERIALIZABLE
Jeśli w obrębie jednej transakcji wykonujemy właśnie polecenie SELECT wówczas z poziomu dowolnej innej transakcji nie możemy wykonać zmiany danych, które są właśnie wybierane poleceniem SELECT. Inaczej mówiąc zapytania w obrębie tranakcji są wykonywane tak, jakby automatycznie była do nich dołączana klauzula LOCK IN SHARE MODE.
Tablice InnoDB wspierają wszystkie cztery poziomy izolacji transakcji. Przy przenoszeniu kodów SQL na inny system baz danych, należy mieć świadomość, że nie szystkie wymienione wyżej poziomy izolacji są wspierane przez inne systemy baz danych, a co więcej, w niektórych z nich domyślnym poziomem izolacji jest zupełnie inny poziom niż w MySQL.
- SQL SERVER - domyślnie READ COMMITTED, poza tym, nie ma żadnych innych poziomów izolacji.
- Oracle - domyślnie READ COMMITTED, poza tym można wybrać też SERIALIZABLE i niestandardowy READ ONLY.
- DB2 - domyślnie REPEATABLE READ, poza tym można wybrać też UNCOMMITTED READ oraz inne niestandardowe poziomy izolacji.
- PostgreSQL - domyślnie REPEATABLE READ, poza tym można też wybrać SERIALIZABLE.
Przykłady,
Zakładamy, że mamy następującą tablicę tab z danymi:
mysql> CREATE TABLE tab (f INT) TYPE = InnoDB; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO tab values (1),(2),(3),(4),(55); Query OK, 5 rows affected (0.00 sec) |
Na początek sprawdźmy jaki poziom izolacji transakcji obowiązuje w danej chwili (jeśli tego nie zmieniliśmy my lub administrator to domyslnym poziomem izolacji transakcji w MySQL jest REPEATABLE READ).
mysql> SELECT @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec) |
Źródło: http://gryf.mif.pg.gda.pl/~mate/wyklady/bazy/transakcje.html
Listing
Ranga: Administrator serwisu Punktów: 0