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

Blokady rzędów - ręcznie za ich pomocą

Podejście, które polecam, to umieszczenie pola w rekordzie wzdłuż linii wskazujących, czy rekord jest przetwarzany, czy nie. Następnie zaimplementuj sproc „odczytaj dalej z kolejki”, który wykonuje następujące czynności, aby zapewnić, że żadne dwa procesy nie odbiorą tego samego rekordu:

BEGIN TRANSACTION

-- Find the next available record that's not already being processed.
-- The combination of UPDLOCK and READPAST hints makes sure 2 processes don't 
-- grab the same record, and that processes don't block each other.
SELECT TOP 1 @ID = ID
FROM YourTable WITH (UPDLOCK, READPAST)
WHERE BeingProcessed = 0

-- If we've found a record, set it's status to "being processed"
IF (@ID IS NOT NULL)
    UPDATE YourTable SET BeingProcessed = 1 WHERE ID = @ID

COMMIT TRANSACTION

-- Finally return the record we've picked up
IF (@ID IS NOT NULL)
    SELECT * FROM YourTable WHERE ID = @ID

Aby uzyskać więcej informacji na temat tych wskazówek dotyczących tabeli, zobacz MSDN



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd składni w pobliżu „z” w warunku wyszukiwania pełnotekstowego „kontrola z”

  2. Zamiana niektórych wierszy na kolumny w SQL Server 2008

  3. Dostrajanie indeksu geoprzestrzennego

  4. Zamień wiele znaków z ciągu bez używania zagnieżdżonych funkcji zamiany

  5. Obcinaj (nie okrągłe) miejsca dziesiętne w SQL Server