Domanda

Ho fatto alcuni test qualche tempo fa e non ho mai capito come farlo funzionare.

Gli ingredienti:

  • Oggetto transazionale COM+ (sviluppato in VB6)
  • Applicazione web .Net (con transazione) in IIS che...
    effettua una chiamata al componente COM+
    aggiorna una riga in un database SQL

Test:

Esegui l'applicazione .Net e forza un'eccezione.

Risultato:

L'aggiornamento effettuato dall'applicazione .Net esegue il rollback.
L'aggiornamento effettuato dall'oggetto COM+ non esegue il rollback.

Se chiamo l'oggetto COM+ da una vecchia pagina ASP il rollback funziona.

So che alcune persone potrebbero pensare "cosa?!COM+ e .Net devi essere fuori di testa!", ma ci sono alcuni posti in questo mondo dove ci sono ancora molti componenti COM+.Ero solo curioso di sapere se qualcuno ha mai affrontato questo problema e se hai capito come farlo funzionare.

È stato utile?

Soluzione

Poiché VB e .NET utilizzeranno connessioni SQL diverse (e non è possibile fare in modo che ADO e ADO.NET condividano la stessa connessione), l'unica possibilità è integrare il DTC (Distributed Transaction Coordinator).Il DTC coordinerà le due transazioni indipendenti in modo che vengano eseguite o annullate insieme.

Da .NET, EnterpriseServices gestisce la funzionalità COM+, ad esempio DTC.In .NET 2.0 e versioni successive è possibile utilizzare lo spazio dei nomi System.Transactions, che rende le cose un po' più belle.Penso che qualcosa del genere dovrebbe funzionare (codice non testato):

void SomeMethod()
{
    EnterpriseServicesInteropOption e = EnterpriseServicesInteropOption.Full;
    using (TransactionScope s = new TransactionScope(e))
    {
        MyComPlusClass o = new MyComPlusClass();

        o.SomeTransactionalMethod();
    }
}

Non ho abbastanza familiarità con questo argomento per darti ulteriori consigli a questo punto.

Sul lato COM+, l'oggetto deve essere configurato per utilizzare (molto probabilmente "richiedere") una transazione distribuita.Puoi farlo da COM+ Explorer, andando sul file object Proprietà, selezionando il Transazione scheda e facendo clic su "Necessario".Non ricordo se puoi farlo anche dal codice;VB6 è stato creato prima del rilascio di COM+, quindi non supporta completamente tutto ciò che fa COM+ (il suo supporto transazionale era pensato per il predecessore di COM+, chiamato MS Transaction Server).

Se tutto funziona correttamente, il tuo oggetto COM+ dovrebbe essere inserito nel contesto esistente creato dal tuo codice .NET.

È possibile utilizzare il nodo "Distributed Transaction Coordinator ransaction List" in "Component Services" per controllare e vedere la transazione distribuita creata durante la chiamata.

Tieni presente che non puoi vedere le modifiche del componente COM+ riflesse sulle query di dati dal lato .NET finché la transazione non viene confermata!In effetti, è possibile raggiungere una situazione di stallo!Ricordare che DTC si assicurerà che le due transazioni siano accoppiate, ma si tratta pur sempre di transazioni di database separate.

Altri suggerimenti

Come lo stai implementando?Se si utilizza EnterpriseServices per gestire la transazione .NET, è necessario eseguire il rollback di entrambe le transazioni, poiché si utilizza lo stesso contesto per entrambe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top