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

Jak zablokować wyłącznie wiersz, który uniemożliwia operację CRUD?

BEGIN TRAN

    SELECT 1
    FROM Table
    WITH (XLOCK, ROWLOCK)

COMMIT TRAN

To załatwi sprawę.

EDYTUJ

Jak zauważyli inni, nie można zablokować wiersza, aby nie był czytany . Jedyny znany mi sposób, aby to zrobić, jest następujący:

WITH (UPDLOCK, TABLOCK)

A to przy założeniu, że WITH (NOLOCK) nigdy nie jest używane w instrukcji SELECT (czego i tak należy unikać).

Testowałem to i zadziała, chociaż TABLOCK powinien być używany tylko w skrajnych przypadkach. Oczywiście, jeśli wymagana jest współbieżność, jest to złe rozwiązanie i potrzebna byłaby jakaś inna forma blokowania. Jednym ze sposobów jest aktualizacja kolumny bitowej „Dostępna prawda/fałsz” i odczytywanie tylko wierszy, w których Dostępne =Prawda. Zgodnie z sugestią @gbn, READPAST może być używany z tym.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Określ ostatni dodany wiersz, gdy nie ma indeksu

  2. Funkcje bezpieczeństwa w SQL Server 2017

  3. Spłaszczanie przecinających się przedziałów czasowych

  4. Stronicowanie po stronie serwera w SQL Server

  5. Ustaw część czasową zmiennej datetime