Атомарно отметьте и возвратите группу строк в базе данных

там какие-либо хорошие учебные руководства о том, как интегрировать OpenId с сайтом ASP.NET?

сообщение Andrew Arnott, названное, "Как добавить OpenID к Вашему веб-сайту ASP.NET (в C# или VB.NET)"

6
задан gbn 30 November 2009 в 17:24
поделиться

5 ответов

Ваша таблица заданий представляет собой очередь. Запись резервных копий пользовательских таблиц в очереди - это общеизвестно склонность к ошибкам, поскольку это приводит к тупикам и проблемам с параллелизмом.

Самым простым было бы отбросить пользовательскую таблицу и использовать вместо нее настоящую очередь . Это даст вам очередь, свободную от взаимоблокировок, свободную от параллелизма в системе протестированной и проверенной базы кода. Проблема в том, что вся парадигма очередей меняется с INSERT и DELETE / UPDATE на SEND / RECEIVE . С другой стороны, со встроенной очередью вы получаете очень мощные бесплатные полезности, а именно Активация и блокировка коррелированных элементов .

Если вы хотите продолжить путь по таблице пользователей поддерживаются очереди, то второй второй самый важный трюк при написании очередей пользовательских таблиц - это использование UPDATE ... OUTPUT:

WITH cte AS (
  SELECT TOP(20) status, id, ...
  FROM table WITH (ROWLOCK, READPAST, UPDLOCK)
  WHERE status = 'new'
  ORDER BY enqueue_time)
UPDATE cte
  SET status = 'processing'
OUTPUT
  INSERTED.id, ...

Синтаксис CTE предназначен только для удобства размещения TOP и ORDER BY должным образом, запрос может быть написан с использованием производных таблиц так же легко. Вы не можете использовать прямое UPDATE ... TOP, потому что UPDATE не поддерживает ORDER BY, и вам нужно, чтобы это удовлетворяло «самой старой» части вашего требования. Подсказки блокировки необходимы для обеспечения высокого уровня согласованности между потоками параллельной обработки.

Я сказал, что это второй по важности трюк. Самое главное - это то, как вы организовываете стол. Для очереди он должен быть кластеризован по (status, enqueue_time) . Если вы не организуете таблицу должным образом, вы попадете в тупик. Упреждающий комментарий: в этом сценарии фрагментация неуместна.

запрос можно так же легко написать с использованием производных таблиц. Вы не можете использовать прямое UPDATE ... TOP, потому что UPDATE не поддерживает ORDER BY, и вам нужно, чтобы это удовлетворяло «самой старой» части вашего требования. Подсказки блокировки необходимы для обеспечения высокого уровня согласованности между потоками параллельной обработки.

Я сказал, что это второй по важности трюк. Самое главное - это то, как вы организовываете стол. Для очереди он должен быть кластеризован по (status, enqueue_time) . Если вы не организуете таблицу должным образом, вы попадете в тупик. Упреждающий комментарий: в этом сценарии фрагментация неуместна.

запрос можно так же легко написать с использованием производных таблиц. Вы не можете использовать прямое UPDATE ... TOP, потому что UPDATE не поддерживает ORDER BY, и вам нужно, чтобы это удовлетворяло «самой старой» части вашего требования. Подсказки блокировки необходимы для обеспечения высокого уровня согласованности между потоками параллельной обработки.

Я сказал, что это второй по важности трюк. Самое главное - это то, как вы организовываете стол. Для очереди он должен быть кластеризован по (status, enqueue_time) . Если вы не организуете таблицу должным образом, вы попадете в тупик. Упреждающий комментарий: в этом сценарии фрагментация неуместна.

часть вашего требования. Подсказки блокировки необходимы для обеспечения высокого уровня согласованности между потоками параллельной обработки.

Я сказал, что это второй по важности трюк. Самое главное - это то, как вы организовываете стол. Для очереди он должен быть кластеризован по (status, enqueue_time) . Если вы не организуете таблицу должным образом, вы попадете в тупик. Упреждающий комментарий: в этом сценарии фрагментация неуместна.

часть вашего требования. Подсказки блокировки необходимы для обеспечения высокого уровня согласованности между потоками параллельной обработки.

Я сказал, что это второй по важности трюк. Самое главное - это то, как вы организовываете стол. Для очереди он должен быть кластеризован по (status, enqueue_time) . Если вы не организуете таблицу должным образом, вы попадете в тупик. Упреждающий комментарий: в этом сценарии фрагментация неуместна.

в итоге будут тупики. Упреждающий комментарий: в этом сценарии фрагментация неуместна.

в итоге будут тупики. Упреждающий комментарий: в этом сценарии фрагментация неуместна.

10
ответ дан 8 December 2019 в 05:21
поделиться

На основе ответа gbn ...

Если вы используете SQL Server 2005 или новее, вы можете вернуть обновленные строки атомарно, используя Предложение OUTPUT в вашем операторе UPDATE :

UPDATE TOP (20) your_table
SET status = 'processing'
OUTPUT INSERTED.*
FROM your_table WITH (ROWLOCK, READPAST, UPDLOCK)
WHERE status = 'new'
4
ответ дан 8 December 2019 в 05:21
поделиться

См. Мой ответ здесь: Состояние гонки очереди процессов SQL Server , которое также управляет 20 строками за один раз.

В принципе, в SQL Server довольно просто управлять параллелизм и опрос с использованием подсказок ROWLOCK, READPAST и UPDLOCK.

Я не могу комментировать Linq, но транзакция по-прежнему оставляет вас открытым для проблем с параллелизмом: вам нужно использовать подсказки, которые я упомянул

8
ответ дан 8 December 2019 в 05:21
поделиться

Я знаю, что это не по теме, но для этого вы можете использовать MSMQ. Очередь сообщений поместит ваши задания в последовательность и потокобезопасна. Вы также можете назначить приоритет тому, что MSMQ самоуправляет. Вы можете использовать чтение или просмотр, чтобы удалить сообщение из очереди или просто посмотреть, что там есть. Вы можете использовать шаблон разработки команд, чтобы помочь вам в этом.

1
ответ дан 8 December 2019 в 05:21
поделиться

Разве это не так просто, как запустить T-SQL внутри транзакции, или я что-то упускаю?

0
ответ дан 8 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: