Задержка задания для ASP.NET для запуска асинхронный код?

Существует ли плагин или другой модуль для имитации Rails Delayed Job в ASP.NET? Каков наилучший способ запуска асинхронного кода или заданий в ASP. SELECT @primaryKey, @ value1, @ value2

У кого-нибудь есть идеи?

67
задан xameeramir 10 February 2016 в 14:26
поделиться

5 ответов

А как насчет Паттерн «JFDI» ?

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH

Серьезно, это самый быстрый и наиболее параллельный вариант без блокировок, особенно на больших объемах. Что, если UPDLOCK расширен, а вся таблица заблокирована?

Прочтите урок 4 :

Урок 4: При разработке процедуры upsert перед настройкой индексов я сначала поверил, что If Exists (Select…) строка сработает для любого элемента и запретит дублирование. Нада. За короткое время были тысячи дубликатов, потому что один и тот же элемент попадал в upsert в одну и ту же миллисекунду, и обе транзакции увидели, что не существует, и выполнили вставку. После долгого тестирования решение заключалось в использовании уникального индекса, обнаружении ошибки и повторной попытке, позволяя транзакции увидеть строку и выполнить обновление вместо вставки.

59
ответ дан 24 November 2019 в 14:42
поделиться

Я добавил HOLDLOCK, которого изначально не было. Не обращайте внимания на версию без этой подсказки.

Насколько я понимаю, этого должно быть достаточно:

INSERT INTO TheTable 
SELECT 
    @primaryKey, 
    @value1, 
    @value2 
WHERE 
    NOT EXISTS 
    (SELECT 0
     FROM TheTable WITH (UPDLOCK, HOLDLOCK)
     WHERE PrimaryKey = @primaryKey) 

Кроме того, если вы действительно хотите обновить строку, если она существует, и вставить, если она не существует, вы можете найти этот вопрос полезный.

23
ответ дан 24 November 2019 в 14:42
поделиться

Вы можете использовать MERGE:

MERGE INTO Target
USING (VALUES (@primaryKey, @value1, @value2)) Source (key, value1, value2)
ON Target.key = Source.key
WHEN MATCHED THEN
    UPDATE SET value1 = Source.value1, value2 = Source.value2
WHEN NOT MATCHED BY TARGET THEN
    INSERT (Name, ReasonType) VALUES (@primaryKey, @value1, @value2)
17
ответ дан 24 November 2019 в 14:42
поделиться

Я не знаю, является ли это "официальным" способом, но вы можете попробовать INSERT и вернуться к UPDATE , если он терпит неудачу.

1
ответ дан 24 November 2019 в 14:42
поделиться

В прошлом я проделывал подобную операцию, используя другой метод. Сначала я объявляю переменную для хранения первичного ключа. Затем я заполняю эту переменную результатами оператора select, который ищет запись с этими значениями. Затем я выполняю оператор IF. Если первичный ключ равен null, то выполняется вставка, в противном случае возвращается код ошибки.

     DECLARE @existing varchar(10)
    SET @existing = (SELECT primaryKey FROM TABLE WHERE param1field = @param1 AND param2field = @param2)

    IF @existing is not null
    BEGIN
    INSERT INTO Table(param1Field, param2Field) VALUES(param1, param2)
    END
    ELSE
    Return 0
END
-4
ответ дан 24 November 2019 в 14:42
поделиться
Другие вопросы по тегам:

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