Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използване на таблица от база данни като опашка

Бих използвал поле IDENTITY като първичен ключ, за да осигуря уникално увеличаващия се ID за всеки елемент в опашката и да залепя клъстерен индекс върху него. Това ще представлява реда, в който елементите са поставени на опашка.

За да запазите елементите в таблицата на опашката, докато ги обработвате, ще ви е необходимо поле „състояние“, за да посочите текущото състояние на конкретен елемент (напр. 0=чака, 1=обработва се, 2=обработва се). Това е необходимо, за да се предотврати обработката на даден елемент два пъти.

Когато обработвате елементи в опашката, ще трябва да намерите следващия елемент в таблицата, който НЕ се обработва в момента. Това трябва да бъде по такъв начин, че да се предотврати едновременното вземане на един и същ елемент за обработка от множество процеси, както е показано по-долу. Обърнете внимание на подсказки за таблицата UPDLOCK и READPAST, които трябва да знаете, когато внедрявате опашки.

напр. в рамките на sproc, нещо като това:

DECLARE @NextID INTEGER

BEGIN TRANSACTION

-- Find the next queued item that is waiting to be processed
SELECT TOP 1 @NextID = ID
FROM MyQueueTable WITH (UPDLOCK, READPAST)
WHERE StateField = 0
ORDER BY ID ASC

-- if we've found one, mark it as being processed
IF @NextId IS NOT NULL
    UPDATE MyQueueTable SET Status = 1 WHERE ID = @NextId

COMMIT TRANSACTION

-- If we've got an item from the queue, return to whatever is going to process it
IF @NextId IS NOT NULL
    SELECT * FROM MyQueueTable WHERE ID = @NextID

Ако обработката на елемент е неуспешна, искате ли да можете да опитате отново по-късно? Ако е така, ще трябва или да нулирате състоянието обратно на 0 или нещо подобно. Това ще изисква повече обмисляне.

Като алтернатива, не използвайте таблица на база данни като опашка, а нещо като MSMQ - просто реших да добавя това в сместа!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изтрийте всички изгледи от Sql сървъра

  2. Как да променим размера на страницата на SQL Server?

  3. Преименувайте първичен ключ в SQL Server (T-SQL)

  4. Как да транспонирате набор от резултати от SQL

  5. Не мога да изпълня ORDERBY срещу моите EF4 данни