Opis współbieżności

Ukończone

Podstawową funkcją baz danych z wieloma użytkownikami jest współbieżność. Współbieżność używa blokowania i zablokowania, aby umożliwić zachowanie spójności danych przez wielu użytkowników aktualizujących i odczytujących dane w tym samym czasie. Na przykład ze względu na koszty wysyłki wszystkie nasze produkty mają wzrost ceny w wysokości 5 USD. Jednocześnie, ze względu na kursy walutowe, wszystkie produkty mają 3% niższe ceny. Jeśli te aktualizacje wystąpią dokładnie w tym samym czasie, ostateczna cena będzie zmienna i prawdopodobnie wystąpi wiele błędów. Za pomocą blokady można upewnić się, że jedna aktualizacja zostanie ukończona przed rozpoczęciem drugiej.

Współbieżność występuje na poziomie transakcji. Transakcja zapisu może blokować aktualizowanie innych transakcji, a nawet odczytywanie tych samych danych. Podobnie transakcja odczytu może blokować innych czytelników, a nawet niektórych pisarzy. Z tego powodu ważne jest, aby uniknąć niepotrzebnie długich transakcji lub transakcji obejmujących nadmierne ilości danych.

Istnieje wiele określonych poziomów izolacji transakcji, które mogą służyć do definiowania sposobu obsługi przez system bazy danych wielu użytkowników. Na potrzeby tego modułu przyjrzymy się szerokim kategoriom poziomu izolacji, optymistycznej blokady i pesymistycznej blokady.

Uwaga / Notatka

Szczegółowe omówienie blokowania transakcji poza współbieżnością bardziej dotyczy wydajności niż samego kodu – chociaż dobry kod działa wydajniej. Aby uzyskać więcej informacji, zapoznaj się ze szczegółowym przewodnikiem dotyczącym blokowania transakcji i przechowywania wersji wierszy programu SQL Server . Aby uzyskać informacje na temat blokowania, zapoznaj się również z dokumentacją dotyczącą wydajności programu SQL Server.

Optymistyczna współbieżność

W przypadku optymistycznego blokowania istnieje założenie, że wystąpi niewiele sprzecznych aktualizacji. Na początku transakcji jest rejestrowany początkowy stan danych. Przed zatwierdzeniu transakcji bieżący stan jest porównywany ze stanem początkowym. Jeśli stany są takie same, transakcja zostanie ukończona. Jeśli stany są różne, transakcja zostanie wycofana.

Na przykład masz tabelę zawierającą zamówienia sprzedaży z ostatnich lat. Te dane są rzadko aktualizowane, ale raporty są często uruchamiane. Dzięki optymistycznej blokadzie transakcje nie blokują się nawzajem, a system działa wydajniej. Niestety, błędy zostały znalezione w ostatnich latach danych i aktualizacje muszą mieć miejsce. Podczas gdy jedna transakcja aktualizuje każdy wiersz, kolejna transakcja wykonuje drobne edycje w jednym wierszu w tym samym czasie. Ponieważ stan danych został zmieniony podczas uruchamiania początkowej transakcji, cała transakcja jest cofana.

Pesymistyczna współbieżność

W przypadku pesymistycznego blokowania istnieje założenie, że wiele aktualizacji dzieje się z danymi w tym samym czasie. Poprzez użycie blokad tylko jedna aktualizacja może nastąpić w tym samym czasie, a odczyty danych są zablokowane podczas dokonywania aktualizacji. Może to zapobiec dużym wycofaniom, jak pokazano w poprzednim przykładzie, ale może spowodować niepotrzebne blokowanie zapytań.

Ważne jest, aby wziąć pod uwagę charakter danych i zapytania uruchomione na danych podczas podejmowania decyzji, czy używać optymistycznej, czy pesymistycznej współbieżności w celu zapewnienia optymalnej wydajności.

Izolacja migawki

W programie SQL Server istnieje pięć różnych poziomów izolacji, ale w tym module skoncentrujemy się tylko na READ_COMMITTED_SNAPSHOT_OFF i READ_COMMITTED_SNAPSHOT_ON. READ_COMMITTED_SNAPSHOT_OFF jest domyślnym poziomem izolacji dla programu SQL Server. READ_COMMITTED_SNAPSHOT_ON jest domyślnym poziomem izolacji dla usługi Azure SQL Database.

READ_COMMITTED_SNAPSHOT_OFF będzie przechowywać blokady w wierszach, których dotyczy problem, do końca transakcji, jeśli zapytanie korzysta z poziomu izolacji transakcji zatwierdzonej do odczytu. Chociaż istnieje możliwość wystąpienia niektórych aktualizacji, takich jak utworzenie nowego wiersza, zapobiegnie to większości konfliktowych zmian w odczytywaniu lub aktualizowaniu danych. Jest to pesymistyczna współbieżność.

READ_COMMITTED_SNAPSHOT_ON tworzy migawkę danych. Aktualizacje są następnie wykonywane na tym zrzucie, co umożliwia innym połączeniom wykonywanie zapytań dotyczących oryginalnych danych. Na końcu transakcji bieżący stan danych jest porównywany z migawką. Jeśli dane są takie same, transakcja zostanie zatwierdzona. Jeśli dane się różnią, transakcja zostanie wycofana.

Aby zmienić poziom izolacji na READ_COMMITTED_SNAPSHOT_ON, wydaj następujące polecenie:

ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT ON;

Aby zmienić poziom izolacji na READ_COMMITTED_SNAPSHOT_OFF, użyj następującego polecenia:

ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT OFF;

Jeśli baza danych została zmieniona w celu włączenia migawki zatwierdzonej do odczytu, każda transakcja używająca domyślnego poziomu izolacji zatwierdzonego do odczytu będzie używać optymistycznego blokowania.

Uwaga / Notatka

Izolacja migawki występuje tylko w przypadku transakcji zatwierdzonych do odczytu. Nie ma to wpływu na transakcje korzystające z innych poziomów izolacji.