2026-03-12 20:23:15
This commit is contained in:
66
tpt/demos/xa1.sql
Normal file
66
tpt/demos/xa1.sql
Normal file
@@ -0,0 +1,66 @@
|
||||
-- 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
|
||||
|
||||
Reference in New Issue
Block a user