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

Zrozumienie blokad SQL Server w zapytaniach SELECT

SELECT w SQL Server umieści wspólną blokadę w wierszu tabeli - i drugi SELECT wymagałoby również wspólnej blokady, a te są ze sobą kompatybilne.

Więc nie - jeden SELECT nie można zablokować innego SELECT .

Co WITH (NOLOCK) wskazówka zapytania służy do odczytywania danych, które są w trakcie wstawiania (przez inne połączenie) i które nie zostały jeszcze zatwierdzone.

Bez tej wskazówki dotyczącej zapytania SELECT może zostać zablokowany odczyt tabeli przez trwający INSERT (lub UPDATE ) oświadczenie, które umieszcza wyłączność zablokuj wiersze (lub ewentualnie całą tabelę), dopóki transakcja tej operacji nie zostanie zatwierdzona (lub wycofana).

Problem WITH (NOLOCK) wskazówka brzmi:być może czytasz wiersze danych, które nie zostaną w ogóle wstawione na końcu (jeśli INSERT transakcja zostanie wycofana) - więc np. raport może pokazywać dane, które tak naprawdę nigdy nie zostały zapisane w bazie danych.

Jest jeszcze jedna wskazówka dotycząca zapytania, która może być przydatna — WITH (READPAST) . To instruuje SELECT polecenie, aby po prostu pominąć wszystkie wiersze, które próbuje odczytać i które są wyłącznie zablokowane. SELECT nie zablokuje się i nie odczyta żadnych "brudnych" niezatwierdzonych danych - ale może pominąć niektóre wiersze, np. nie pokazuj wszystkich swoich wierszy w tabeli.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dodaj ograniczenie CHECK do istniejącej tabeli w SQL Server (T-SQL)

  2. Jak SHOWPLAN_XML działa w SQL Server

  3. Jak zmienić nazwę tabeli w SQL Server

  4. Przykłady konwersji „daty” na „przesunięcie daty” w SQL Server (T-SQL)

  5. Czy powinienem używać wbudowanej kolumny varchar(max) czy przechowywać ją w osobnej tabeli?