📄 netxapositive.out
字号:
ij> xa_datasource 'wombat';ij> -------------------------------------------------- a single connection and 1 phase commit-----xa_connect ;ij> xa_start xa_noflags 0;ij> xa_getconnection;ij(XA)> -- Global transactions can not have hold cursor over commit. And hence we need to make sure the holdability is false for all jdks----- In jdk13 and lower, this Brokered Connection has its holdability false over commit so we are fine. ----- In jdk14 and higher, this Brokered Connection has its holdability true over commit. In order to set it to false, we have NoHoldForConnection ----- NoHoldForConnection uses setHoldability api on Connection to set the holdability to false. But this api exists only for jdk14 and higher----- And that is why, in jkd13 master, we see an exception nosuchmethod NoHoldForConnection;ij(XA)> drop table foo;ERROR 42Y55: 'DROP TABLE' cannot be performed on 'FOO' because it does not exist.ij(XA)> create table foo (a int);0 rows inserted/updated/deletedij(XA)> insert into foo values (0);1 row inserted/updated/deletedij(XA)> select * from foo;A -----0 ij(XA)> run resource '/org/apache/derbyTesting/functionTests/tests/store/global_xactTable.view';ij(XA)> create view global_xactTable asselect cast(global_xid as char(2)) as gxid, status, case when first_instant is NULL then 'NULL' else 'false' end as readOnly, cast (username as char(10)) as username, type from new org.apache.derby.diag.TransactionTable() t;0 rows inserted/updated/deletedij(XA)> select * from global_xactTable where gxid is not null order by gxid;GXID |STATUS |READ& |USERNAME |TYPE -----(0 |ACTIVE |false |APP |UserTransaction ij(XA)> xa_end xa_success 0;ij(XA)> xa_commit xa_1phase 0;ij(XA)> xa_datasource 'wombat' shutdown;ERROR 08006: DERBY SQL error: SQLCODE: -1, SQLSTATE: 08006, SQLERRMC: Database 'wombat' shutdown.ij(XA)> -------------------------------------------------- two interleaving connections and prepare/commit prepare/rollback-----xa_datasource 'wombat';ij(XA)> xa_connect user 'sku' password 'testxa' ;ij(XA)> xa_start xa_noflags 1;ij(XA)> xa_getconnection;ij(XA)> -- Global transactions can not have hold cursor over commit. And hence we need to make sure the holdability is false for all jdks----- In jdk13 and lower, this Brokered Connection has its holdability false over commit so we are fine. ----- In jdk14 and higher, this Brokered Connection has its holdability true over commit. In order to set it to false, we have NoHoldForConnection ----- NoHoldForConnection uses setHoldability api on Connection to set the holdability to false. But this api exists only for jdk14 and higher----- And that is why, in jkd13 master, we see an exception nosuchmethod NoHoldForConnection;ij(XA)> insert into APP.foo values (1);1 row inserted/updated/deletedij(XA)> xa_end xa_suspend 1;ij(XA)> xa_start xa_noflags 2;ij(XA)> insert into APP.foo values (2);1 row inserted/updated/deletedij(XA)> xa_end xa_suspend 2;ij(XA)> xa_start xa_resume 1;ij(XA)> insert into APP.foo values (3);1 row inserted/updated/deletedij(XA)> xa_end xa_suspend 1;ij(XA)> xa_start xa_resume 2;ij(XA)> insert into APP.foo values (4);1 row inserted/updated/deletedij(XA)> select * from APP.global_xactTable where gxid is not null order by gxid;GXID |STATUS |READ& |USERNAME |TYPE -----(1 |ACTIVE |false |SKU |UserTransaction (2 |ACTIVE |false |SKU |UserTransaction ij(XA)> xa_end xa_success 2;ij(XA)> xa_start xa_resume 1;ij(XA)> insert into APP.foo values(5);1 row inserted/updated/deletedij(XA)> xa_end xa_success 1;ij(XA)> xa_prepare 1;ij(XA)> xa_prepare 2;ij(XA)> -- both transactions should be preparedselect * from APP.global_xactTable where gxid is not null order by gxid;GXID |STATUS |READ& |USERNAME |TYPE -----(1 |PREPARED |false |SKU |UserTransaction (2 |PREPARED |false |SKU |UserTransaction ij(XA)> xa_recover xa_startrscan;Recovered 2 in doubt transactionsTransaction 1 : {ClientXid: formatID(2), gtrid_length(6), bqual_length(6), data(776F6D62 6174776F 6D626174)}Transaction 2 : {ClientXid: formatID(1), gtrid_length(6), bqual_length(6), data(776F6D62 6174776F 6D626174)}ij(XA)> xa_recover xa_noflags;Recovered 0 in doubt transactionsij(XA)> xa_commit xa_2Phase 1;ij(XA)> xa_rollback 2;ij(XA)> -- check resultsxa_start xa_noflags 3;ij(XA)> select * from APP.global_xactTable where gxid is not null order by gxid;GXID |STATUS |READ& |USERNAME |TYPE -----(3 |IDLE |NULL |SKU |UserTransaction ij(XA)> select * from APP.foo;A -----0 1 3 5 ij(XA)> xa_end xa_success 3;ij(XA)> xa_prepare 3;ij(XA)> -- should fail with XA_NOTA because we prepared a read only transaction xa_commit xa_1Phase 3;IJ ERROR: XAER_NOTA ij(XA)> -- DERBY-246 xa_end after connection close should be ok. ----- Also to reuse xaconnection in the same global transactionxa_getconnection;ij(XA)> xa_start xa_noflags 4;ij(XA)> create table APP.derby246 (i int);0 rows inserted/updated/deletedij(XA)> insert into APP.derby246 values(1);1 row inserted/updated/deletedij(XA)> disconnect;ij> xa_getconnection;ij(XA)> insert into APP.derby246 values(2);1 row inserted/updated/deletedij(XA)> disconnect;ij> xa_end xa_success 4;ij> xa_prepare 4;ij> xa_commit xa_2phase 4;ij> -- now connect with a local connection to make sure locks are released ----- and our values are there. Should see two rowsconnect 'wombat';ij(CONNECTION1)> select * from APP.derby246;I -----1 2 ij(CONNECTION1)> disconnect;ij>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -