Область действия транзакции sproc вызывает тупик - PullRequest
0 голосов
/ 15 октября 2019

Я хотел бы знать, почему запуск этой программы вызывает взаимные блокировки таблицы dbo.tb_Push при одновременном запуске нескольких экземпляров одной и той же программы. Я знаю, что сериализуемая область транзакции является проблемой, но мне хотелось бы объяснить, почемуобновление до тупиков dbo.tb_Push, обновления всегда передают разные значения для каждого экземпляра программы, спасибо.

using (var transactionScope =
        new TransactionScope(TransactionScopeOption.Required,
        new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.Serializable, Timeout = TransactionManager.DefaultTimeout }))
{
    TransactionInterop.GetTransmitterPropagationToken(Transaction.Current);
    try
    {
        using (repository = new Repository(settings))
        {
            repoPush = repository.GetPushDAO();
            price = repoPricingPush.GetNextPush(instance_name);
            if (price.Count > 0)
            {
                //do stuff on other servers/db's
                repoPricingPush.SavePushStatus(price[0].PushSid, true, true, null);
            }
            else
                return;
        }
        transactionScope.Complete();
    }
    catch
    {
        throw;
    }
    finally
    {
        transactionScope.Dispose();
    }
}

SavePushStatus - это хранимая процедура со следующим:

UPDATE dbo.tb_Push SET
    [Processed] = @piProcessed,
    [OOS] = @piOOS,
    [Error] = @piError
WHERE
    Price_Push_SID = @piPricePushSid;
...