ORA-01591: lock held by in-doubt distributed transaction

L'errore "ORA-01591: blocco trattenuto da transazione distribuita in dubbio", significa che nel database sono presenti alcune transazioni non committate.

C'è stato un tentativo di accesso a una risorsa bloccata da una transazione di commit a due fasi (two-phase commit trnsaction) morta che è in stato "prepared".

È necessario eseguire il "rollback force" o il "commit force" per le transazioni non committate per risolvere questo problema.

Query per individuare le transazioni non committate o pending (in sospeso) con il seguente script che genera anche il comando di forza di rollback

SQL> select 'rollback force '''||local_tran_id||''';' from DBA_2PC_PENDING where state='prepared';

SQL> select 'commit force '''||local_tran_id||''';' from DBA_2PC_PENDING where state='prepared';


Che cos'è una in-doubt distributed transaction?

Le transazioni distribuite possono diventare in-doubt nei seguenti modi: una macchina server che esegue il software Oracle Database si arresta in modo anomalo. Una connessione di rete tra due o più database Oracle coinvolti nell'elaborazione distribuita viene disconnessa. Si verifica un errore software non gestito.

Che cosa è two-phase commit trnsaction?

Un commit a due fasi è un protocollo standardizzato che garantisce che un commit del database venga implementato nella situazione in cui un'operazione di commit deve essere suddivisa in due parti separate. 
Oracle ha sviluppato il commit in due fasi per consentire all'SQL di controllo di garantire che tutti i siti remoti abbiano eseguito il commit dei propri dati prima di emettere un commit locale. Sebbene l'integrità dei dati sia gestita in modo molto efficace all'interno di un unico database con row locking, deadlock detection and roll-back features, l'integrità dei dati distribuiti è molto più complessa.

Se è in corso un aggiornamento distribuito (ad esempio un upate su due db) per l'emissione del 2PC e una connessione di rete si interrompe, Oracle inserirà una entry nella tabella DBA_2PC_PENDING .
 Il processo di ripristino in background (RECO) eseguirà quindi il rollback o eseguirà il commit del nodo valido in modo che corrisponda allo stato del nodo disconnesso per garantire la coerenza.





Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database