Spójność bazy danych jest również jednym z ważnych wskaźników mierzących wydajność DBMS. Obecnie większość komercyjnych baz danych (DB2, SQL Server) korzysta z protokołu Dwufazowego Blokowania (2PL) do kontroli współbieżności, który zapewnia serializację równoczesnego wykonywania transakcji. Jednak 2PL musi zablokować wszelkie dane, zanim będzie mógł je odczytać lub zapisać. W macierzy zgodności blokującej blokady S (Share Locks) i X blokady (wyłączne blokady) są niekompatybilne, więc gdy transakcja 1 wykonuje operację odczytu danych A (plus blokada S), a transakcja 2 chce zapisać dane (dodać blokadę X), transakcja 2 musi poczekać, aż transakcja 1 zwolni blokadę S na danych A, zanim będzie kontynuowana. Multi-Version Concurrency Control (MVCC) dobrze rozwiązuje ten problem. W systemie wielowersyjnym każda data zapisu generuje nową wersję, a operacja odczytu może odczytać odpowiednią wersję w razie potrzeby, dzięki czemu operacje odczytu i zapisu nie blokują się nawzajem. MVCC zwiększa współbieżność, ale wprowadza też narzut pamięci masowej związany z utrzymywania wielu wersji.
Silnik bazy danych Microsoft SQL Server wprowadza nową implementację istniejącego poziomu izolacji transakcji – zadeklarowanych odczytów, które zapewniają migawki na poziomie instrukcji z wykorzystaniem wersjonowania wiersza. Silnik bazy baz danych SQL Server wprowadza także nowy poziom izolacji transakcji – migawki umożliwiające tworzenie migawek na poziomie transakcji, które również wykorzystują wersjonowanie wierszy.
Ustawienie opcji READ_COMMITTED_SNAPSHOT bazy danych na ON umożliwia zaangażowaną izolację odczytu przy użyciu wersjonowania wiersza. Ustawienie opcji ALLOW_SNAPSHOT_ISOLATION bazy danych na ON umożliwia izolację migawek. Gdy któraś z opcji jest włączona dla bazy danych, silnik bazy danych zachowuje wersję każdego zmodyfikowanego wiersza. Za każdym razem, gdy transakcja modyfikuje wiersz, obraz wiersza sprzed modyfikacji jest kopiowany na stronę w magazynie wersji. Magazyn wersji to zbiór stron danych w tempdb. Jeśli istnieje wiele linii modyfikacji transakcji, wiele wersji tej linii będzie połączonych w łańcuch wersji. Operacja odczytu z wykorzystaniem wersjonowania wiersza pobiera ostatnią wersję każdego wiersza, która została zatwierdzona w momencie rozpoczęcia transakcji lub instrukcji.
Aplikacje napisane dla SQL Server 2008 lub nowe dla SQL Server implementują izolację zatwierdzeń odczytu za pomocą wersjonowania wiersza, określając poziom izolacji transakcji dla zatwierdzeń odczytu, gdy opcja READ_COMMITTED_SNAPSHOT bazy danych jest włączona. Wszystkie odczyty będą sprawdzać wersję wiersza, która została zatwierdzona na początku oświadczenia. To dostarczy migawkę danych na poziomie instrukcji.
Aplikacje napisane dla SQL Server implementują izolację snapshotów, określając poziom izolacji transakcji snapshot, gdy opcja ALLOW_SNAPSHOT_ISOLATION bazy danych jest WŁĄCZONA. Wszystkie odczyty w transakcji snapshot będą sprawdzać wersję wiersza, która została zatwierdzona na początku transakcji. To dostarczy migawkę danych na poziomie transakcji.
Dla transakcji wykorzystujących poziomy izolacji wierszowej, odczyty nie żądają współdzielonych blokad danych. Oznacza to, że czytniki korzystające z wersjonowania wierszy nie uniemożliwiają innym czytelnikom lub autorom dostępu do tych samych danych. Podobnie pisarz nie przeszkadza czytelnikowi. Jednak scenarzyści przeszkadzają sobie nawzajem (nawet gdy pracują na poziomie izolacji opartym na wersowaniu wierszy). Dwie operacje zapisu nie mogą jednocześnie modyfikować tych samych danych.
Funkcja Snapshot Isolation rozszerza ramy blokowania w SQL Server 2008, umożliwiając aplikacjom przeglądanie wartości przed dokonaniem jakichkolwiek modyfikacji danych. Zapobiega to zablokowaniu aplikacji, a jednocześnie dostarcza dane naprawdę przesłane. Read Committed Snapshot w SQL Server 2008 wymaga aktywacji administratora bazy danych, co pozwala na odczyt danych w transakcjach tylko do odczytu. Kontrola współbieżności transakcji tylko do odczytu przez SI jest bardzo dobra, ale nie jest jasne, czy dotyczy to transakcji aktualizacyjnych. Mniej korzystne jest, gdy długotrwałe transakcje aktualizacji konkurują z krótkoterminowymi transakcjami na wysokim poziomie. Jeśli transakcja między bazami danych próbuje użyć standardu Snapshot Isolation (SI) zamiast ustawić wszystkie bazy danych, transakcja kończy się niepowodzeniem. To niewątpliwie stwarza pewne przeszkody dla skalowalności. Wygląda na to, że Microsoft ma jeszcze długą drogę do osiągnięcia własnego SI, które będzie silniejsze niż specyfikacja SQL 92.
Przed jakąkolwiek modyfikacją wykonaj kopię poprzedniej wersji, a wszystkie kolejne operacje odczytu odczytają skopiowaną wersję, a modyfikacja utworzy nową wersję. W ten sposób,Operacje odczytu i zapisu nie blokują się nawzajem. Zaletą stosowania tego mechanizmu wersjonowania linii jest stosunkowo wysoka równocześność programu, ale wadą jest to, że choć użytkownik nie odczytuje brudnych danych, może to być wartość danych, która jest modyfikowana i wkrótce wygaśnie. Jeśli zmodyfikujesz dane na podstawie tej wygasłej wartości, spowoduje to błąd logiczny。
Polecenia SQL:
Linki referencyjne:
Logowanie do linku jest widoczne.
Logowanie do linku jest widoczne.
Logowanie do linku jest widoczne.
Logowanie do linku jest widoczne.
Logowanie do linku jest widoczne.
Logowanie do linku jest widoczne.
|