Ich verwende TransactionScope in der Datenschicht und um MSDTC zu vermeiden, halte ich eine Verbindung offen, bis der Transaktionsbereich abgeschlossen ist. Ich finde diesen Ansatz ist problematisch, da es die Verbindung für den gesamten Transaktionsprozess offen und besetzt hält. Methoden, die innerhalb des Transaktionsbereichs aufgerufen werden, können länger dauern (z. B. 1 Minute). Also habe ich meinen Ansatz geändert, um keine Verbindung zu verwenden, sondern die Verbindung zu derselben Datenbank zu öffnen und zu schließen, wenn dies erforderlich ist.TransactionScope: Wenn die Verbindung zu MSDTC eskaliert wird
So:
using (TransactionScope scope = new TransactionScope())
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using(SqlCommand sqlc = new SqlCommand(statement, Connection, transaction))
{
//Execute some commands
}
connection.Close();
}
SomeLongRunningTask();
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using(SqlCommand sqlc = new SqlCommand(statement, Connection, transaction))
{
//Execute some commands
}
connection.Close();
}
...
...
...
scope.Complete();
}
Kann jemand vorschlagen, wenn dieser Code noch zu MSDTC Transaction eskalieren können. Ziel dieser Änderung ist es, die Verbindung für eine minimale Zeit offen zu halten.
Sehen Sie einen Nachteil in diesem Ansatz?