Позвольте мне объяснить проблему подробно.Мы используем инициированные пользователем транзакции для всех наших вызовов 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 поступают в рамках транзакции, инициированной пользователем.
Я хотел бы знать, как это может произойти и что мы делаем неправильно в этом подходе.