Sto usando TransactionScope
per rendere un metodo che contiene più transazioni transazionali SQL. Ora ho bisogno di chiamare un secondo metodo che utilizza anche la stessa connessione e ricevo seguente eccezione a connection.Open()
:
Accesso di rete per transazione distribuitaManager (MSDTC) è stato Disabilitato. Si prega di abilitare DTC per l'accesso alla rete nella sicurezza configurazione per MSDTC utilizzando il componente Servizi amministrativi strumento.
Quindi questo è lo pseudo-codice:
public static void Method1()
{
using (TransactionScope scope = new TransactionScope())
{
bool success = true; // will be set to false in an omitted catch
using (var connection = new SqlConnection(ConnectionString1))
{
// ...
if(somethingHappened)
Method2();
}
if(success)
scope.Complete();
}
}
public static void Method2()
{
using (var connection = new SqlConnection(ConnectionString1))
{
connection.Open(); // BOOOM!
// ...
}
}
Come evitare questa eccezione senza ripetere il codice da Method2
in Method1
?
risposte:
2 per risposta № 1Se più di una connessione sono aperte sotto lo stesso TransactionScope
verrà automaticamente inoltrato al DTC.
È necessario chiudere la prima connessione prima di chiamare Method2
.
public static void Method1()
{
using (TransactionScope scope = new TransactionScope())
{
bool success = true; // will be set to false in an omitted catch
bool isSomethingHappened
using (var connection = new SqlConnection(ConnectionString1))
{
isSomethingHappened = // Execute query 1
}
if(somethingHappened)
Method2();
if(success)
scope.Complete();
}
}
2 per risposta № 2
Le connessioni nidificate nell'ambito dello stesso ambito di transazione promuoveranno una transazione distribuita.
Dal server SQL 2008 e le connessioni multiple (non nidificanti) sotto lo stesso ambito di transazione non verranno promosse a un transaciton distribuito.
vedere Questo domanda per ulteriori informazioni
0 per risposta № 3
Non conosco la risposta precisa, ma renderei la connessione un membro e tenere traccia se è aperta.
Quindi in Method1 e Method2 otterrei la connessione tramite alcuni GetConnection () che aprirebbero la connessione al primo utilizzo.
Dopo aver letto i commenti suggerirei un DoMethod2 privato che accetta un oggetto di connessione.