Ich habe die Aussetzung der EF 6-Ausführungsstrategie überall dort implementiert, wo ich verteilte Transaktionen verwenden muss, um zu vermeiden, dass '' SqlAzureExecutionStrategy 'vom Benutzer initiierte Transaktionen nicht unterstützt' Ausnahmen nach diesen Beispielen:EF 6 Ausführungsstrategie und überlappende Ausführungen aussetzen - "Benutzerinitiierte Transaktionen werden nicht unterstützt" Ausnahme
https://romiller.com/2013/08/19/ef6-suspendable-execution-strategy/ https://msdn.microsoft.com/en-us/library/dn307226(v=vs.113).aspx
Doch vor kurzem habe ich zwei Fehler dieses während einer Sitzung Massendatenverwaltung, was nach allen oben genannten Ausnahme zu bekommen.
Wenn ich es richtig verstehe, aktivieren/deaktivieren die gegebenen Beispiele die Ausführungsstrategie auf globaler Ebene, was bedeutet, dass wenn Aktionen gleichzeitig an mehreren Threads ausgeführt werden, eine Aktion die Aufhebung beenden kann, bevor eine andere beendet wird. Der Effekt ist wahrscheinlich am auffälligsten, wenn .NET 4.6.1 für Transaktionen verwendet wird, die mehrere SQL Azure-DBs umfassen, was einige Zeit in Anspruch nehmen kann.
Um dies zu vermeiden, ich auf die Schaffung einer globalen Transaktionszähler zurückgegriffen, die in einem Thread sichere Art und Weise erhöht und erniedrigt, und Aufhebung der Aussetzung nur dann, wenn es mehr anhängig keine Transaktionen sind, wie:
public class MyConfiguration : DbConfiguration
{
public MyConfiguration()
{
this.SetExecutionStrategy("System.Data.SqlClient",() => SuspendExecutionStrategy
? (IDbExecutionStrategy)new DefaultExecutionStrategy()
: new SqlAzureExecutionStrategy());
}
public static bool SuspendExecutionStrategy
{
get
{
return (bool?)CallContext.LogicalGetData("SuspendExecutionStrategy") ?? false;
}
set
{
CallContext.LogicalSetData("SuspendExecutionStrategy", value);
}
}
}
Und dann:
Ich bin immer noch verwirrt, dass das Beispiel auf MSDN berücksichtigt dies nicht berücksichtigt. Gibt es etwas, das ich übersehen habe?