7

nasıl kullanılır (https://msdn.microsoft.com/en-us/data/dn456835.aspx)Ben SqlAzureExecutionStrategy kullanmaya çalışıyorum SQL zaman aşımları başa çıkmak için SqlAzureExecutionStrategy ve "nolock"

I içine çalıştırıyorum sorun tavsiye gibi görünüyor "kullanıcı tarafından başlatılan hareketleri" önler EF (, NOLOCK with Linq to SQL) ile birlikte "(nolock)" uygulama yöntemi.

örnek kod

public AspnetUser GetAspnetUserByUserName(string userName) 
    { 
     using (var tx = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted })) 
     { 
      return context.AspnetUsers.Where(x => x.UserName == userName).FirstOrDefault(); 
     } 
    } 

hatayı

'SqlAzureExecutionStrategy' kullanıcı tarafından başlatılan işlem desteği yapılandırılmış yürütme stratejisi atar. Daha fazla bilgi için bkz. http://go.microsoft.com/fwlink/?LinkId=309381.

Bir arama bazında SqlAzureExecutionStrategy kapatmak için söylemek cevapları gördüm ama hepsi benim stratejisini göz ardı yazıyorsa o, bunu kullanarak amacı yenmek. Hem "NoLock" hem de SqlAzureExecutionStrategy

cevap

11

SqlAzureExecutionStrategy öğesinin, yeniden denenecek eylemin dışında başlatılan işlemleri desteklememesi mümkündür. İşte

public AspnetUser GetAspnetUserByUserName(string userName) 
{ 
    new SuspendableSqlAzureExecutionStrategy().Execute(() => 
     { 
      using (var tx = new TransactionScope(
        TransactionScopeOption.Required, 
        new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted })) 
      { 
       return context.AspnetUsers.Where(x => x.UserName == userName).FirstOrDefault(); 
      } 
     }); 
} 

Ama bir alternatif için kullanıyorum: Bu kısıtlama geçici olarak çözmek için size yeniden denenmek üzere, strateji askıya işlem kapsamı oluşturmak ve el yürütme stratejiye geçmesi bir eylem olarak çalışma yapmak gerekir otomatik olarak iç içe çağırmaları askıya alacaktır https://msdn.microsoft.com/en-us/data/dn307226 aşılabilecek stratejisi:

using System.Data.Entity.Infrastructure; 
using System.Data.Entity.SqlServer; 
using System.Data.Entity.Utilities; 
using System.Runtime.Remoting.Messaging; 
using System.Threading; 
using System.Threading.Tasks; 

public class SuspendableSqlAzureExecutionStrategy : IDbExecutionStrategy 
{ 
    private readonly IDbExecutionStrategy _azureExecutionStrategy; 

    public SuspendableSqlAzureExecutionStrategy() 
    { 
     _azureExecutionStrategy = new SqlAzureExecutionStrategy(); 
    } 

    private static bool Suspend 
    { 
     get { return (bool?)CallContext.LogicalGetData("SuspendExecutionStrategy") ?? false; } 
     set { CallContext.LogicalSetData("SuspendExecutionStrategy", value); } 
    } 

    public bool RetriesOnFailure 
    { 
     get { return !Suspend; } 
    } 

    public virtual void Execute(Action operation) 
    { 
     if (!RetriesOnFailure) 
     { 
      operation(); 
      return; 
     } 

     try 
     { 
      Suspend = true; 
      _azureExecutionStrategy.Execute(operation); 
     } 
     finally 
     { 
      Suspend = false; 
     } 
    } 

    public virtual TResult Execute<TResult>(Func<TResult> operation) 
    { 
     if (!RetriesOnFailure) 
     { 
      return operation(); 
     } 

     try 
     { 
      Suspend = true; 
      return _azureExecutionStrategy.Execute(operation); 
     } 
     finally 
     { 
      Suspend = false; 
     } 
    } 

    public virtual async Task ExecuteAsync(Func<Task> operation, CancellationToken cancellationToken) 
    { 
     if (!RetriesOnFailure) 
     { 
      await operation(); 
      return; 
     } 

     try 
     { 
      Suspend = true; 
      await _azureExecutionStrategy.ExecuteAsync(operation, cancellationToken); 
     } 
     finally 
     { 
      Suspend = false; 
     } 
    } 

    public virtual async Task<TResult> ExecuteAsync<TResult>(Func<Task<TResult>> operation, CancellationToken cancellationToken) 
    { 
     if (!RetriesOnFailure) 
     { 
      return await operation(); 
     } 

     try 
     { 
      Suspend = true; 
      return await _azureExecutionStrategy.ExecuteAsync(operation, cancellationToken); 
     } 
     finally 
     { 
      Suspend = false; 
     } 
    } 
} 

public class MyConfiguration : DbConfiguration 
{ 
    public MyConfiguration() 
    { 
     SetExecutionStrategy("System.Data.SqlClient",() => new SuspendableSqlAzureExecutionStrategy()); 
    } 
} 
+0

Ben bunu sayesinde nasıl çalıştığını bildirmek için bu hafta, bu sınamak için çalışacağız bu yüzden yaklaşık açık değilim –

+0

Tek şey Askıya alınması halka açık olmalıdır. Bunu şimdi de denemek, MSDN sürümünden daha temiz görünüyor. –

+0

Sadece iyi çalışıyor. Benim tarafımda özel olmak için askıya alındı, ancak bu oldukça güzel bir uygulama, bunun için teşekkürler. –

İlgili konular