Стратегия приостановки выполнения SQL Server Azure, похоже, работает неправильно в веб-интерфейсе asp.net - PullRequest
0 голосов
/ 04 марта 2019

Позвольте мне объяснить проблему подробно.Мы используем инициированные пользователем транзакции для всех наших вызовов POST в Web API.Эти транзакции инициируются и завершаются / откатываются в фильтре настраиваемых действий.Код такой, как показано ниже.

public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if(RequiresTransactionInitiation(actionContext))
        {
            CurrentContext.SuspendExecutionStrategy = true;

         UnitOfWork.StartTransaction(System.Data.IsolationLevel.ReadCommitted);
        }
        base.OnActionExecuting(actionContext);

    }

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {


        if (RequiresTransactionCompletion(actionExecutedContext))
        {

            if (actionExecutedContext.Exception == null)
            {
                UnitOfWork.Complete()
            }
            else
            {
                UnitOfWork.Rollback();
            }
            CurrentContext.SuspendExecutionStrategy = false;
        }
        base.OnActionExecuted(actionExecutedContext);
    }


    internal bool RequiresTransactionCompletion(HttpActionExecutedContext actionExecutedContext) 
        => actionExecutedContext.Request.Method != HttpMethod.Get;

    private bool RequiresTransactionInitiation(HttpActionContext actionContext) 
        => actionContext.Request.Method != HttpMethod.Get
            && !actionContext.ActionDescriptor.GetCustomAttributes<NonTransactionalAttribute>(false).Any();

Мы также используем SqlAzureExcecutionStrategy для повторных попыток вызовов GET, и для этого существует глобальный флаг viz.CurrentContext.SuspendExecutionStrategy (реализовано с использованием HttpContext.Current), который указывает, следует ли приостановить стратегию выполнения.

Таким образом, в случае POST для флага SuspendExecutionStrategy установлено значение true, и стратегия выполнения должна быть приостановлена.

Ниже приведен код стратегии выполнения ...

    public class AzureDbConfiguration : DbConfiguration
{
    public AzureDbConfiguration()
    {
        this.SetExecutionStrategy("System.Data.SqlClient", () => CurrentContext.SuspendExecutionStrategy
            ? (IDbExecutionStrategy)new DefaultExecutionStrategy()
            : new SqlAzureExecutionStrategy);
    }
}

Проблема, с которой мы сейчас сталкиваемся, заключается в том, что это работает нормально в большинстве сценариев, но в некоторых случайных случаях мы начинаем сталкиваться с проблемами.например, «Настроенная стратегия выполнения« SqlAzureExecutionStrategy »не поддерживает инициированные пользователем транзакции».И странная часть в том, что это происходит во время вызовов GET, что означает, что даже вызовы GET поступают в рамках транзакции, инициированной пользователем.

Я хотел бы знать, как это может произойти и что мы делаем неправильно в этом подходе.

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