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 quelle distribuite non sono supportate da Gruppi di disponibilità AlwaysOn o dal mirroring del database perché l'atomicità e integrità delle transazioni non può essere garantita per i motivi seguenti:

  • In caso di transazioni tra database, il relativo commit viene eseguito in modo indipendente. Pertanto, anche per i database presenti in un solo gruppo di disponibilità, potrebbe verificarsi un failover dopo il commit di una transazione da parte di un database, ma prima che la stessa operazione venga effettuata da un altro database. Per il mirroring del database questo problema è ancora più complesso perché dopo un failover, il database con mirroring si trova in genere in un'istanza del server diversa dall'altro database e, anche se viene eseguito il mirroring di entrambi i database tra gli stessi due partner, non esiste garanzia alcuna che verrà eseguito il failover di entrambi i database contemporaneamente.

  • In caso di transazioni distribuite, dopo un failover, tramite il nuovo server principale o la nuova replica primaria non è possibile effettuare la connessione al Distributed Transaction Coordinator (DTC) nel server principale o replica primaria precedente. Per questo motivo, tramite il nuovo server principale o la nuova replica primaria non è possibile ottenere lo stato delle transazioni.

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

Dopo il failover, è possibile che il commit della transazione tra database abbia esito positivo sul database B, ma non sul database di cui è stato eseguito il failover. Questa situazione si verifica qualora il server principale originale del database A non abbia inviato il log per la transazione tra database al server mirror prima dell'errore. Dopo il failover, tale transazione non è più presente nel nuovo server principale. I database A e B diventano inconsistenti perché i dati inseriti nel database B rimangono inalterati, mentre quelli inseriti nel database A sono stati persi.

Uno scenario analogo può verificarsi quando si utilizza una transazione MS DTC. Ad esempio, dopo il failover, il nuovo server principale contatta MS DTC. MS DTC, tuttavia, non rileva il nuovo server principale e termina tutte le transazioni di cui si sta preparando il commit e per le quali in altri database il commit viene considerato eseguito.