/ / TransactionScope e chiamata al metodo che utilizza la stessa connessione - c #, sql-server-2012, transazioni, ado.net, transactioncope

TransactionScope e chiamata al metodo che utilizza la stessa connessione: c #, sql-server-2012, transazioni, ado.net, transactioncope

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 № 1

Se 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.