67 lines
2.3 KiB
SQL
67 lines
2.3 KiB
SQL
-- Copyright 2018 Tanel Poder. All rights reserved. More info at http://tanelpoder.com
|
|
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms & conditions.
|
|
|
|
-- Taken and customized from http://docs.oracle.com/cd/E18283_01/appdev.112/e17125/adfns_xa.htm
|
|
|
|
-- CREATE TABLE xa_t (a INT, b VARCHAR2(100));
|
|
-- INSERT INTO xa_t VALUES (1, 'tanel is testing');
|
|
-- COMMIT;
|
|
|
|
SET SERVEROUT ON
|
|
|
|
--ACCEPT global_trans_id NUMBER DEFAULT 123 PROMPT "Enter value for global_trans_id [123]: "
|
|
DEF global_trans_id = &1
|
|
PROMPT
|
|
|
|
REM Session 1 starts a transaction and does some work.
|
|
DECLARE
|
|
gtid NUMBER := &global_trans_id;
|
|
|
|
PROCEDURE handle_err (rc IN PLS_INTEGER, p_comment IN VARCHAR2 DEFAULT 'N/A') IS
|
|
xae EXCEPTION;
|
|
oer PLS_INTEGER;
|
|
BEGIN
|
|
IF rc!=DBMS_XA.XA_OK THEN
|
|
oer := DBMS_XA.XA_GETLASTOER();
|
|
DBMS_OUTPUT.PUT_LINE('ORA-' || oer || ' occurred, XA call '||p_comment||' failed');
|
|
RAISE xae;
|
|
ELSE
|
|
DBMS_OUTPUT.PUT_LINE('XA call '||p_comment||' succeeded');
|
|
END IF;
|
|
END handle_err;
|
|
|
|
BEGIN
|
|
HANDLE_ERR(SYS.DBMS_XA.XA_SETTIMEOUT(5), 'XA_SETTIMEOUT');
|
|
HANDLE_ERR(DBMS_XA.XA_START(DBMS_XA_XID(gtid), DBMS_XA.TMNOFLAGS), 'XA_START ('||gtid||')');
|
|
UPDATE xa_t SET b = 'tanel is not testing anymore' WHERE a = 1;
|
|
HANDLE_ERR(DBMS_XA.XA_END(DBMS_XA_XID(gtid), DBMS_XA.TMSUSPEND), 'XA_END/SUSP('||gtid||')');
|
|
|
|
HANDLE_ERR(DBMS_XA.XA_PREPARE(DBMS_XA_XID(gtid)), 'XA_PREPARE ('||gtid||')');
|
|
-- this is not needed for our test
|
|
-- DBMS_LOCK.SLEEP(10);
|
|
-- HANDLE_ERR(DBMS_XA.XA_ROLLBACK(DBMS_XA_XID(gtid)), 'XA_ROLLBACK('||gtid||')');
|
|
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
DBMS_OUTPUT.PUT_LINE('XA error occurred, rolling back the transaction ...');
|
|
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
|
|
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK);
|
|
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_CALL_STACK);
|
|
HANDLE_ERR(DBMS_XA.XA_END(DBMS_XA_XID(gtid), DBMS_XA.TMSUCCESS), 'XA_END/SUCC('||gtid||')');
|
|
HANDLE_ERR(DBMS_XA.XA_ROLLBACK(DBMS_XA_XID(gtid)), 'XA_ROLLBACK('||gtid||')');
|
|
|
|
END;
|
|
/
|
|
|
|
PROMPT Now wait for 10 seconds and run SELECT * FROM dba_2pc_pending;;
|
|
|
|
EXEC DBMS_LOCK.SLEEP(10);
|
|
|
|
COL tran_comment FOR A20
|
|
COL global_tran_id FOR A20
|
|
|
|
SELECT * FROM dba_2pc_pending WHERE state != 'forced rollback';
|
|
|
|
SET SERVEROUT OFF
|
|
|