Files
oracle/tpt/demos/xa1.sql

67 lines
2.3 KiB
MySQL
Raw Normal View History

2026-03-12 21:23:47 +01:00
-- 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