Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zarządzaj współbieżnością transakcji za pomocą blokad w SQL Server

W środowisku wielu użytkowników niezbędne jest zachowanie współbieżności obcinania. Te blokady są strukturami w pamięci o rozmiarze 96 bajtów. Ich rolą jest utrzymanie integralności danych, spójności, kontroli współbieżności dla każdej transakcji. SQL Server wykonuje test ACID dla każdej transakcji.

  • A tomicity:ta właściwość zapewnia, że ​​transakcja obejmująca dwa lub więcej procesów zostanie w pełni zatwierdzona lub żaden z procesów nie zostanie zatwierdzony.
  • C onsistency:Daje gwarancję stanu zatwierdzonej transakcji. Transakcja powinna albo utworzyć nowy stan danych, albo powrócić do stanu istniejącego (przed transakcją).
  • Ja rozwiązanie:Wskazuje, że transakcje są od siebie odizolowane. Jeśli transakcja jest uruchomiona i nie zatwierdziła danych, jest odizolowana od innych transakcji.
  • D urability:trwałość gwarantuje, że Twoje dane nigdy nie zostaną utracone. Zapobiega awariom zasilania i systemu operacyjnego lub innym błędom wywołanym przez oprogramowanie.

Aby zapewnić właściwości ACID, SQL Server nakłada na obiekty różne rodzaje blokad. W takim przypadku inne transakcje muszą poczekać, aż blokada zostanie zwolniona.

Tryby blokowania

SQL Server używa następujących trybów blokowania dla każdej transakcji.

  • Współdzielone blokady:
    • W tej blokadzie SQL Server umożliwia innym sesjom wykonywanie wybranych operacji odczytu danych. Jednak zapobiega aktualizacjom, dopóki blokada nie jest aktywna.
    • Wiele transakcji może jednocześnie nałożyć wspólną blokadę na wiersz lub stronę.
    • Jest to powszechna blokada, którą widzisz na obiektach bazy danych.

W poniższym języku T-SQL pobieramy rekord klienta dla określonego identyfikatora klienta. Ponadto używamy dynamicznego widoku zarządzania sys.dm_tran_locks, aby sprawdzić istniejące blokady.

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (HOLDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK

Jak pokazano poniżej, ma wspólną blokadę na podanym identyfikatorze zasobu (8194443284a0):

  • Ekskluzywne (X) zamki:
    • SQL Server używa blokady na wyłączność (X) dla operacji DML (usuń, wstaw lub zaktualizuj), wymagających modyfikacji danych wiersza lub strony.
    • Uniemożliwia innym użytkownikom dostęp do zasobu, dopóki blokada nie zostanie nałożona.
    • SQL Server może mieć tylko jedną wyłączną blokadę na stronie lub wierszu dla transakcji.

W tym przykładzie chcemy zaktualizować rekordy dla identyfikatora klienta 1. Dlatego SQL Server wymaga wyłącznej blokady zasobu. Żadna inna transakcja nie może uzyskać wyłącznej blokady tego zasobu, dopóki transakcja nie zostanie zakończona.

BEGIN TRAN
UPDATE [SalesLT].[Customer] 
SET Suffix='Mr.'  
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Aktualizacja zamków (U):
    • Blokada aktualizacji jest podobna do blokady na wyłączność. Można go umieścić na rekordzie ze wspólną blokadą.
    • Blokada aktualizacji umieszcza inną wspólną blokadę w określonym wierszu. Po zmodyfikowaniu rekordów SQL Server konwertuje blokadę aktualizacji na blokadę wyłączną.
    • SQL Server nie może nałożyć udostępnionej blokady na zasób z blokadą aktualizacji.
    • Możesz również użyć WITH UPDLOCK do wymuszenia blokady aktualizacji.

Poniższy przykład pokazuje blokadę aktualizacji na identyfikatorze zasobu (8194443284a0):

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (UPDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Zamki celowe:
    • Jego celem jest poinformowanie transakcji o zamiarze nabycia blokady. Występuje, gdy transakcja wymaga współdzielonej lub wyłącznej blokady zasobów znajdujących się niżej w hierarchii.
    • Transakcja nie pozwala innym transakcjom na uzyskanie wyłącznej blokady na stole przy użyciu blokady intencji.
    • Rodzaje zamków intencyjnych znajdują się poniżej.
      • Intent Shared (IS) lock:Wskazuje, że SQL Server zamierza odczytać zasoby niższej hierarchii poprzez uzyskanie indywidualnej blokady współdzielonej na tych zasobach niższej hierarchii.
      • Zamek na wyłączność intencji (IX):Wskazuje, że SQL Server zamierza zmodyfikować zasoby niższej hierarchii przez uzyskanie blokady na wyłączność na tych zasobach niższej hierarchii.
      • Zamierzona blokada aktualizacji (IU):Można ją uzyskać na poziomie strony tylko dla niższych zasobów hierarchicznych, a po zakończeniu aktualizacji konwertuje się na blokadę IX.

Jak pokazano poniżej, transakcja ma blokadę na wyłączność na kluczu i ma blokadę na wyłączność na poziomie strony.

Blokady konwersji

SQL Server konwertuje typy blokad w celu obsługi wielu zapytań w transakcji. Te blokady są znane jako blokady konwersji.

  • SIX – Shared with Intent Exclusive lock:Transakcja SQL Server posiada wspólną blokadę na kilku stronach i ma wyłączność zablokować kilka rzędów.
  • SIU – Transakcja SQL Server posiada wspólną blokadę na kilku stronach i ma Aktualizację zablokować kilka rzędów.
  • UIX — aktualizacja z intencją wyłączną blokadą:transakcja SQL Server utrzymuje blokadę aktualizacji na kilku stronach i ma wyłączność zablokować kilka rzędów.

Blokady schematu

SQL Server uzyskuje dwa rodzaje blokad schematów.

  • Blokada stabilności schematu (Sch-S):Ta blokada jest używana podczas kompilacji zapytania zależnego od schematu i generowania planu wykonania. Blokada Sch-S nie blokuje żadnego dostępu do danych obiektu.
  • Blokada modyfikacji schematu (Sch-M):Ta blokada wynika z wykonania zapytania DDL (języka definicji danych). SQL Server może mieć tylko jedną blokadę modyfikacji schematu na obiekcie. Nie możesz modyfikować obiektu z tą blokadą schematu.

W poniższym przykładzie otrzymujemy zarówno blokady Sch-S, jak i Sch-M podczas modyfikowania definicji obiektu.

BEGIN TRAN
Alter TABLE DemoTable ADD new bit
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'
ROLLBACK

Kompatybilność blokady

Kompatybilność blokad jest pomocna w sprawdzaniu dozwolonych blokad w przypadku wielu transakcji w tym samym zasobie jednocześnie. Jeśli transakcja zakłada blokadę, nowa blokada nałożona przez inną transakcję powinna być z nią zgodna. Dlatego możesz przejrzeć poniższą listę kompatybilności blokad i znaleźć obsługiwane blokady podczas wielu transakcji.

Zablokuj eskalacje

SQL Server wprowadził funkcję eskalacji blokad, aby zapobiec nadmiernemu blokowaniu, które może powodować obciążenie pamięci. SQL Server dynamicznie uwzględnia liczbę blokad utrzymywanych podczas konkretnego skanowania oraz liczbę blokad utrzymywanych przez całą transakcję i pamięć. SQL Server konwertuje blokady niskiego poziomu na blokady wysokiego poziomu w ramach eskalacji blokad. Na przykład konwertuje blokady wierszy na blokady na poziomie strony.

Używa następującego progu do eskalacji blokady.

  • Próg pamięci: Próg pamięci blokady jest ustawiony na 40 procent pamięci blokady.
  • Próg blokady: Jeśli liczba nabytych blokad w bieżącej tabeli lub indeksie jest większa niż 5000, mogą zostać uruchomione eskalacje blokad.

Użytkownicy mogą kontrolować eskalację blokad za pomocą instrukcji alter table. Możesz całkowicie wyłączyć eskalację blokady dla tej tabeli, używając wartości parametru DISABLE.

ALTER TABLE Table_name SET (LOCK_ESCALATION = < TABLE | AUTO | DISABLE > –One of those options) GO

Możesz zapoznać się z dokumentacją Microsoft dla szczegółowego zrozumienia eskalacji blokady.

Uwaga:nie należy wyłączać eskalacji blokady, dopóki nie zostanie ona dokładnie przetestowana w niższym środowisku i jest zalecana tylko przez doświadczonych administratorów baz danych.

Wniosek

Ten artykuł zawiera szczegółowe omówienie blokad programu SQL Server i DMV w celu monitorowania blokady i procesu jej eskalacji. Blokowanie jest całkiem normalnym zachowaniem w SQL Server i powinieneś być z nim zaznajomiony, aby zrozumieć, jak działa wiele transakcji, symulując i dostarczając spójne dane.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dowiedz się, czy ograniczenie CHECK jest na poziomie kolumny czy na poziomie tabeli w programie SQL Server (przykłady T-SQL)

  2. 3 sposoby, aby dowiedzieć się, czy kolumna jest kolumną obliczaną w SQL Server

  3. Jak znaleźć element listy w określonej pozycji w SQL Server

  4. Sposoby, aby wiedzieć, jak radzić sobie z uszkodzeniem bazy danych w SQL Server

  5. Zwróć informacje o kolumnie z serwera połączonego w programie SQL Server (przykłady T-SQL)