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

Czy można wymusić blokowanie na poziomie wiersza w SQL Server?

Możesz użyć wskazówki ROWLOCK, ale AFAIK SQL może zdecydować o eskalowaniu jej, jeśli zabraknie mu zasobów

Z doco:

ROWLOCK Określa, że ​​blokady wierszy są podejmowane, gdy blokady strony lub tabeli są zwykle brane. W przypadku określonych transakcji nietransakcyjnych działających na poziomie SNAPSHOTisolation, blokady wierszy nie są wykonywane, chyba że funkcja ROWLOCK jest połączona z innymi wskazówkami dotyczącymi tabeli, które wymagają blokad, takimi jak UPDLOCK i HOLDLOCK.

i

Wskazówki dotyczące blokad ROWLOCK, UPDLOCK i XLOCK, które uzyskują blokady na poziomie wiersza, mogą blokować klucze indeksu zamiast rzeczywistych wierszy danych. Na przykład, jeśli atable ma indeks nieklastrowany, a instrukcja SELECT używająca wskazówki dotyczącej blokady jest obsługiwana przez indeks pokrywający, blokada jest uzyskiwana na kluczu indeksu w indeksie pokrywającym, a nie na wierszu danych w tabeli bazowej.

I na koniec daje to dość szczegółowe wyjaśnienie dotyczące eskalacji blokad w SQL Server 2005, która została zmieniona w SQL Server 2008.

Jest też bardzo szczegółowa:Blokowanie w silniku bazy danych (w książkach online)

Tak więc ogólnie

UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93

Powinno być w porządku, ale w zależności od indeksów i obciążenia serwera może to doprowadzić do zablokowania strony.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zaplanować codzienne uruchamianie zapytania SQL?

  2. Wywołanie procedury składowanej za pomocą VBA

  3. Uzyskaj wiele wartości w kursorze SQL Server

  4. na czym polega problem z AttachDbFilename?

  5. Wyzwalacze programu SQL Server — część 2 — wyzwalacze DDL i LOGON