Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Sommario
Quando si usano transazioni XA che includono Microsoft driver JDBC per SQL Server, è possibile che vengano visualizzate transazioni orfane in sospeso nel server che esegue Microsoft SQL Server. Queste transazioni orfane si verificano in genere quando il gestore transazioni smette di rispondere o perde la connettività al server basato su SQL Server prima del completamento della transazione XA. Questo articolo illustra i sintomi, le cause, i passaggi diagnostici e le strategie di risoluzione per le transazioni XA orfane in SQL Server.
Symptoms
È possibile che si verifichino uno o più dei problemi seguenti:
- Le transazioni rimangono in uno stato in sospeso per molto tempo in SQL Server.
- Le transazioni vengono visualizzate avendo un ID sessione
NULLo-2nel database. - Le transazioni bloccano altre transazioni a tempo indefinito e causano timeout di blocco e thread bloccati.
Verificare transazioni XA orfane
Per verificare le transazioni XA orfane, seguire questa procedura:
Eseguire query sulle transazioni XA attive usando la vista di gestione dinamica (DMV) sys.dm_tran_active_transactions
SELECT transaction_id, name, transaction_state FROM sys.dm_tran_active_transactions WHERE name LIKE '%XA%';Verificare la presenza di transazioni con ID sessione di
-2:SELECT request_session_id, resource_type, resource_database_id FROM sys.dm_tran_locks WHERE request_session_id = -2;Questo ID segnala una transazione distribuita orfana.
Verificare che la transazione soddisfi entrambe le condizioni seguenti prima di provare a risolvere il problema:
- La transazione non è in uno stato preparato (incerto).
- La transazione non completa il ripristino.
Motivo
Se la connettività tra gestione transazioni e SQL Server viene persa prima della preparazione della transazione XA, il driver JDBC non pulisce queste transazioni. A causa dell'implementazione XA nel driver JDBC per SQL Server, SQL Server non è in grado di rilevare disconnessioni anomale dei gestori delle transazioni.
Il risultato è che le transazioni orfane rimangono attive fino a quando non si verifica uno degli eventi seguenti:
- Si verifica il timeout della transazione XA. Per impostazione predefinita, SQL Server imposta il timeout su infinito.
- SQL Server riavvii.
Annotazioni
Il timeout della transazione XA non è configurabile a livello di SQL Server. Richiede la gestione esterna.
Soluzioni
Usare uno dei metodi seguenti per risolvere le transazioni XA orfane.
Riavviare SQL Server
Riavviare SQL Server dopo eventuali errori O interruzioni di rete JVM che generano transazioni orfane. Il riavvio cancella i riferimenti alle transazioni in memoria.
Terminare manualmente le transazioni orfane
Eseguire la query seguente per identificare e arrestare le transazioni che superano il ripristino dell'applicazione:
SELECT transaction_id, name FROM sys.dm_tran_active_transactions WHERE name LIKE '%XA%';Dopo aver trovato gli ID delle transazioni orfane, eseguire il commit o il rollback usando XAResource in Java. Per esempio:
Commit
XAResource xaRes = xaConnection.getXAResource(); xaRes.commit(xaTransactionId, bOnePhase);Rollback
XAResource xaRes = xaConnection.getXAResource(); xaRes.rollback(xaTransactionId);
Configurare il timeout delle transazioni XA
Impostare un timeout XA per garantire la pulizia automatica delle transazioni orfane. Il valore di timeout deve essere più lungo della transazione con esecuzione più lunga. Per esempio:
XAResource xaRes = xaConnection.getXAResource();
xaRes.setTransactionTimeout(600); // Timeout in seconds
Annotazioni
Molti gestori di transazioni di terze parti non espongono XAResource. In questi casi, usa un'app di gestione esterna per impostare un valore di timeout predefinito a livello globale.
Migliori pratiche preventive
Seguire queste linee guida per ridurre il rischio di transazioni XA orfane:
Assicurarsi che il servizio MS DTC sia in esecuzione e configurato per XA in tutti i nodi partecipanti. Per SQL Server in Linux, vedere Come configurare il Microsoft Distributed Transaction Coordinator (MSDTC) in Linux.
Applicare le impostazioni di sicurezza di MS DTC e abilitare le Transazioni XA in
dcomcnfg.Usare le proprietà XA di JDBC:
xaTransactionTimeout=600 loginTimeout=30