2009-05-20 7 views
6

Sto utilizzando il framework .NET 2.0/3.5 per la mia applicazione. Ho bisogno di eseguire diversi comandi SQL su più connessioni e ogni connessione è su un server diverso (Oracle, SQL Server). Devo assicurarmi che questi comandi siano transazionali.Comandi transazionali SQL multipli su diverse connessioni di database

Ad esempio: È necessario eseguire un INSERT in una tabella su entrambi i database Oracle e SQL Server, quindi eseguire il commit se non sono state generate eccezioni. Se c'è stata un'eccezione, mi piacerebbe eseguire il rollback su entrambi i server, se necessario.

Sospetto che sarà necessario utilizzare System.Transactions e TransactionScope. Ciò richiederà che imposti il ​​Microsoft Distributed Transaction Coordinator (MSDTC) sui server di database e anche il server delle applicazioni.

Ho guardato in alto e in basso e non sono riuscito a trovare articoli che descrivessero passo passo la configurazione di MSDTC con l'autenticazione reciproca (compresa la configurazione delle impostazioni del firewall e delle impostazioni MSDTC.) Ho guardato la documentazione Microsoft sull'impostazione di MSDTC, ma sembra completamente privo di valore e non completamente documentato (a meno che tu non riesca a trovarmi un articolo MSDN veramente buono su come configurarlo.)

L'utilizzo di MSDTC è l'unico modo per completare il mio lavoro?

Se sì, come diavolo si configura correttamente?

EDIT:

  • Sto usando Windows Server 2003 per tutte le macchine.
  • Ho due server SQL. Uno è SQL Server 2000 e l'altro è 2005.
  • Ho un server Oracle ed è la versione 11g
  • L'applicazione che stiamo sviluppando a volte deve alterare/creare record su tutti e tre i database in modo transazionale.
  • Non è un problema tra la tastiera e la sedia. Leggiamo gli articoli su MSDN su come impostare tutto ciò che riguarda MSDTC, ma non possiamo far funzionare DTCP e altre applicazioni di test. Stavamo cercando un articolo dettagliato che descrivesse dettagliatamente il processo. Ho trovato la documentazione MSDN in più di un'occasione che ha "escluso" i passaggi per fare certe cose.

risposta

5

Purtroppo entrambi i documenti ufficiali di entrambi i fornitori sembrano felici di menzionare il provider di servizi di interoperabilità o l'altro, ma entrambi sembrano riluttanti a riconoscere l'esistenza dell'offerta di database dell'altro.

Potrebbe essere preferibile la documentazione su Oracle Services for Microsoft Transaction Server.

  • Oracle Documentazione: le versioni
    • 10g
    • 9i
    • vecchi esistono, ma molto sembra essere cambiato dopo 8

Da ODP.NET 10.2.0.3 in poi dovresti (se hai correttamente configurato MS DTC e il OraMTS dll è presente) essere in grado di utilizzare semplicemente System.Transactions TransactionScope proprio come si farebbe se si coordinasse tra due database SQL Server ma utilizzando un server SQL e una connessione Oracle. Oracle 10 in poi potrebbe essere necessario affinché funzioni in modo semplice e immediato.

Here is a guide to using DTC from .net 2.0 and Sql Server 2005 onwards. In particolare, prende nota dei requisiti del sistema operativo (che in gran parte non dovrebbero essere più un problema, ma vale la pena notare). Inoltre, a meno che sia i database sia il client si trovino sulla stessa macchina, è necessario abilitare DTC di rete.

1

Uso server collegati per tutte le mie attività come questa. Rende più facile per noi gestire le informazioni di connessione e le credenziali. Fondamentalmente uno stop shopping per tutti i nostri bisogni.

Modifica: maggiori dettagli - Abbiamo un database utilizzato esclusivamente per la segnalazione. Otteniamo i nostri dati dal server di tutta la società. Non abbiamo un solo account per accedere a questi server, alcuni di loro usano un ID funzionale, altre le nostre credenziali AD. Avvolgere tutte queste connessioni in server collegati separati ha funzionato meglio per noi. Sul nostro server di segnalazione abbiamo attualmente 16 server collegati.

Inoltre, le query vengono archiviate in viste per facilitare l'accesso alle nostre applicazioni e ai report di cristallo. Quindi, invece di dover creare più stringhe di connessione nel nostro codice, usiamo solo una singola stringa globale per connettersi al Db dei rapporti.

0

Questo è un classico problema di transazione distribuita ed è ciò che MSDTC è per. Cerca i monitor delle transazioni e il protocollo XA per una descrizione più approfondita di questa classe di problemi.

0

Quando si utilizzano più connessioni, è necessario utilizzare il DTC.Una singola connessione può gestire una singola transazione, ma se si hanno più connessioni, è necessario un coordinatore di transazioni per gestire il protocollo di commit a due fasi.

1

La mia risposta potrebbe essere un po 'strana, ma ti consiglierò (se è tecnicamente possibile) valutare l'utilizzo di 2 transazioni indipendenti per ogni database. La mia preoccupazione per le transazioni distribuite/XA è rappresentata dalle prestazioni generali del database/scalabilità/latenza.

2 collegamenti che cercheranno di dimostrare il mio punto di vista:.

  1. Martin Fowler notes: "Bisogna prestare attenzione a l'ordine dei commit, ottenendo i più importanti in primo Ad ogni commit si deve controlla che ci sia riuscito e decidi cosa fare se fallisce. "
  2. Interview regarding eBay architecture
-1

Sì, avrete bisogno di creare un ambito di transazione ed i provider ADO.NET per SQL e Oracle sarà iscriversi ogni connessione in una singola transazione distribuita, coordinato da MSDTC.

La documentazione MSDN su come configurare MSDTC è piuttosto elaborata e copre specificamente le domande che si pongono: Enable Firewall Exceptions for MS DTC, Configuring Security for Distributed Transactions.

Si omette di menzionare il sistema operativo in esecuzione sul client, la versione di SQL Server, la versione Oracle, il sistema operativo back-end per SQL Server (s) e Oracle (s). Inoltre trascuri di dire a qualsiasi effettivo problema che hai riscontrato o messaggio di errore che hai visto. In questo momento, il problema sembra essere situato da qualche parte tra tastiera e sedia.