Condividi tramite


Transazioni tra database non supportate per il mirroring del database o i gruppi di disponibilità AlwaysOn (SQL Server)

Le transazioni tra database e le transazioni distribuite non sono supportate dai gruppi di disponibilità AlwaysOn o dal mirroring del database. Ciò è dovuto al fatto che l'atomicità/integrità delle transazioni non può essere garantita per i motivi seguenti:

  • Per le transazioni tra database: ogni database esegue il commit indipendentemente. Pertanto, anche per i database in un singolo gruppo di disponibilità, un failover può verificarsi dopo che un database esegue il commit di una transazione, ma prima che l'altro database lo faccia. Per il mirroring del database, questo problema si aggrava perché dopo un failover, il database con mirroring si trova tipicamente in un'istanza del server diversa dall'altro database e, anche se entrambi i database sono con mirroring tra gli stessi due partner, non esiste alcuna garanzia che entrambi i database eseguano il failover contemporaneamente.

  • Per le transazioni distribuite: dopo un failover, la nuova replica principale/server principale non è in grado di connettersi al coordinatore delle transazioni distribuite nel server principale o nella replica primaria precedente. Di conseguenza, il nuovo server principale o la replica principale non riesce a ottenere lo stato della transazione.

Nell'esempio di mirroring del database seguente viene illustrato come può verificarsi un'incoerenza logica. In questo esempio un'applicazione usa una transazione tra database per inserire due righe di dati: una riga viene inserita in una tabella in un database con mirroring, A e l'altra riga viene inserita in una tabella in un altro database, B. Il database A viene sottoposto a mirroring in modalità a sicurezza elevata con failover automatico. Durante il commit della transazione, il database A diventa non disponibile e la sessione di mirroring esegue automaticamente il failover sul mirror del database A.

Dopo il failover, il commit della transazione tra database potrebbe essere eseguito correttamente nel database B, ma non nel database di cui è stato eseguito il failover. Ciò si verifica se il server principale originale per il database A non ha inviato il log per la transazione tra database al server mirror prima dell'errore. Dopo il failover, tale transazione non esiste nel nuovo server principale. I database A e B diventano incoerenti, perché i dati inseriti nel database B rimangono intatti, ma i dati inseriti nel database A sono andati persi.

Uno scenario simile può verificarsi durante l'uso di una transazione MS DTC. Ad esempio, dopo il failover, il nuovo principale contatta MS DTC. Tuttavia, MS DTC non conosce il nuovo server principale e termina tutte le transazioni che stanno "preparando il commit", considerate sottoposte a commit in altri database.

Importante

L'uso del mirroring del database o dei gruppi di disponibilità insieme a DTC non comporta un'installazione di SQL Server non supportata. Se, tuttavia, un database fa parte di una sessione di mirroring del database o di un gruppo di disponibilità e DTC viene usato anche nel database, i problemi di supporto verranno esaminati da Microsoft solo se non correlati all'uso combinato del mirroring del database o dei gruppi di disponibilità con DTC.