Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Abrufen der Update-Tabellensperre beim Start der gespeicherten Prozedur in SQL Server

Sie sagten:

Sie benötigen lediglich eine gemeinsame Lesesperre für die Dauer des TXN. Dies bedeutet, dass kein anderer Prozess in Verbindung mit einem TABLOCK eine "Schreibsperre" erhalten kann. Und COUNT brauchst du auch nicht.

...
   BEGIN TRANSANCTION
     SELECT TOP 1 KeyCol FROM TheTable WITH (TABLOCK, HOLDLOCK)
...

Warum glauben Sie, dass Sie eine UPDATE-SPERRE wünschen?

HOLDLOCK oder SERIALIZABLE

Bearbeiten, nach Kommentar:

  • "exklusive Sperre" bedeutet "nur ein Prozess verwendet die Daten".
  • "SERIALISIERBAR" bedeutet im Grunde, die Sperren (gemeinsam, exklusiv, was auch immer) viel länger zu halten.

Sie können keine "exklusive Sperre" und angeben anderen Prozessen das Lesen erlauben. Die Konzepte schließen sich gegenseitig aus. Sie möchten Schreibvorgänge in die gesamte Tabelle verhindern, die beibehalten werden Shared/Read Lock reicht aus. Hier kommt SERIALIZABLE ins Spiel.

Aus "Sperrmodi"

Also:Eine gemeinsam genutzte Sperre verbietet Schreibvorgänge und kann dauerhaft gemacht werden, indem sie SERIALISIERBAR gemacht wird