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

Jak wykonać blokadę rzędu?

Zakładając, że jest to serwer MS SQL, prawdopodobnie chcesz UPDLOCK , prawdopodobnie w połączeniu z ROWLOCK (Wskazówki dotyczące tabeli ). Mam problem ze znalezieniem przyzwoitego artykułu opisującego teorię, ale oto krótki przykład:

SELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1 

Ta instrukcja nałoży blokadę aktualizacji w wierszu przez czas trwania transakcji (dlatego ważne jest, aby być świadomym, kiedy transakcja się zakończy). Ponieważ blokady aktualizacji są niezgodne z blokadami na wyłączność (wymagane do aktualizacji rekordów), uniemożliwi to każdemu zaktualizowanie tego rekordu do czasu zakończenia transakcji.

Należy zauważyć, że inne procesy próbujące zmodyfikować ten rekord zostaną zablokowane do czasu zakończenia transakcji, jednak po zakończeniu transakcji będą kontynuowały dowolną operację zapisu, o którą poprosiły (chyba że przekroczono limit czasu lub zostaną one zabite jako proces zakleszczony). Jeśli chcesz temu zapobiec, twoje inne procesy muszą użyć dodatkowych wskazówek, aby albo przerwać, jeśli zostanie wykryta niekompatybilna blokada, albo pominąć rekord, jeśli się zmienił.

Ponadto Nie należy używać tej metody do blokowania rekordów podczas oczekiwania na dane wejściowe użytkownika . Jeśli taki jest twój zamiar, powinieneś zamiast tego dodać do tabeli jakąś kolumnę „jesteś modyfikowany”.

Mechanizmy blokowania serwera SQL są tak naprawdę odpowiednie tylko do zachowania integralności danych / zapobiegania zakleszczeniu - transakcje powinny być generalnie tak krótkie, jak to możliwe i z pewnością nie powinien być utrzymywany podczas oczekiwania na dane wejściowe użytkownika.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Scal dane z dwóch wierszy w jeden

  2. Ulepszenia Service Broker w SQL Server 2016

  3. Jak wygenerować wszystkie skrypty ograniczeń

  4. Wprowadzenie do funkcji zdefiniowanych przez użytkownika w SQL Server

  5. Podczas wykonywania procedury składowanej, jaka jest korzyść z używania CommandType.StoredProcedure w porównaniu z używaniem CommandType.Text?