2 PHASE COMMIT OVERVIEW

Il protocollo di commit in due fasi è composto da una serie di azioni che garantiscono una transazione che coinvolge più database non produce aggiornamenti non sincronizzati.

Il commit in due fasi fornisce un modo per una serie di interazioni di database su più origini dati diverse da raggruppare e completare o eseguire il rollback come un’unica transazione. Commit in due fasi le transazioni che rappresentano una serie di interazioni di database su più origini dati sono indicate come transazioni globali.

All’inizio di una transazione globale, un ID di transazione globale (XID) viene generato e utilizzato da un esterno gestore delle transazioni per guidare l’elaborazione del commit in due fasi su tutti i gestori delle risorse coinvolti. Ogni interazione con il database nell’ambito della transazione globale viene eseguita su di esso gestore delle risorse associato.

I risultati delle interazioni vengono quindi rinviati all’applicazione per l’elaborazione. Quando il database le interazioni nell’ambito della transazione globale sono terminate, una chiamata di preparazione viene inviata a ciascuna risorsa manager a cui ha avuto accesso la transazione globale.

La chiamata di preparazione offre a ciascun responsabile delle risorse la possibilità di determinare e riferire sulla propria capacità di impegnarsi il lavoro svolto nell’ambito della transazione globale. Dopo aver ricevuto la verifica che ogni risorsa manager può eseguire il commit del proprio lavoro, il gestore delle transazioni invia una chiamata di commit a ciascun gestore delle risorse. In qualsiasi momento prima dell’invio della chiamata di commit, è possibile eseguire il rollback della transazione di commit in due fasi. Se viene eseguito il rollback della transazione, viene inviata una chiamata di rollback a ciascun gestore risorse coinvolto nella transazione e le modifiche temporanee vengono rimosse o eliminate.

Se si verificano errori del database durante la fase di commit, il gestore delle transazioni esterno tenta di far ristabilire una connessione con il gestore delle risorse e riprende la sua chiamata per il gestore delle risorse al commt.

Se il gestore delle transazioni non riesce durante la fase di commit, il gestore delle transazioni esegue il ripristino l’elaborazione al riavvio e tenta di ristabilire una connessione con tutti i gestori delle risorse coinvolti. Quando i gestori delle transazioni ristabiliscono le connessioni, riprende la sua chiamata per la risorsa responsabili di impegnarsi.

Di seguito due script per trovare le transazioni sql_text (1) e per eseguire automaticamente il rollback (2):
1) check_2pc.sh
. /home/oracle11/cfg/env_ORCL
sqlplus -s / As sysdba @/home/oracle11/check_2pc.sql
a) check_2pc.sql
alter session set nls_date_Format=’YYYYMMDD’;
col filename new_value filename
select ‘/var/log/’||SYSDATE||’_’||NAME||’_check_2pc.log’ filename from v$database;
spool &filename append;
SET SERVEROUTPUT ON
DECLARE
tmpStmt VARCHAR2(4000);
ESITO VARCHAR2 (4000);
CURSOR table_cur IS
select a.sql_id as sql_id from v$session a, dba_2pc_neighbors n, dba_2pc_pending p where
a.USERNAME=n.DBUSER_OWNER and a.STATUS=’ACTIVE’ and p.state=’prepared’ group by a.sql_id;
BEGIN
FOR tbl IN table_cur LOOP
BEGIN
tmpStmt := ‘SELECT s.sql_text FROM DBA_HIST_ACTIVE_SESS_HISTORY h join DBA_HIST_SQLTEXT s on
h.sql_id=s.sql_id where h.SQL_ID = ”’||tbl.sql_id||”’ ORDER BY 1′;
EXECUTE IMMEDIATE tmpStmt into ESITO;
DBMS_OUTPUT.PUT_LINE(ESITO);
END;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
alter session set nls_date_Format=’YYYY-MM- DD HH24:MI:SS’;
set head off feedback off
select sysdate from dual;
select ‘– — — — — — — — — — — — — — ‘ from dual;
exit
2) rollback.sh
. /home/oracle11/cfg/env_ORCL
sqlplus -s / As sysdba @/home/oracle11/rollback.sql
a) rollback.sql
alter session set nls_date_Format=’YYYYMMDD’;
col filename new_value filename
select ‘/var/log/’||SYSDATE||’_’||NAME||’_rollback_2pc.log’ filename from v$database;
spool &filename append;
SET SERVEROUTPUT ON
DECLARE
tmpStmt VARCHAR2(4000);
BEGIN
FOR sqlStmt IN
(
SELECT LOCAL_TRAN_ID FROM dba_2pc_pending where state=’prepared’ order by FAIL_TIME
)
LOOP
tmpStmt := ‘ROLLBACK FORCE ”’||sqlStmt.local_tran_id||””;
DBMS_OUTPUT.PUT_LINE(tmpStmt);
EXECUTE IMMEDIATE tmpStmt;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
— select ‘rollback force ”’||LOCAL_TRAN_ID||”’;’ as TO_ROLLBACK from dba_2pc_pending where
state=’prepared’ order by FAIL_TIME;
alter session set nls_date_Format=’YYYY-MM- DD HH24:MI:SS’;
set head off feedback off
select sysdate from dual;
select ‘– — — — — — — — — — — — — — ‘ from dual;
exit
https://www.ibm.com/support/knowledgecenter/en/SSEPH2_13.1.0/com.ibm.ims13.doc.ccg/ims_ct_2phazcomt_overview.htm

Potrebbero interessarti anche...

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *