rollback方法java_Java XAResource.rollback方法代码示例

import javax.transaction.xa.XAResource; //导入方法依赖的package包/类

/**

* Tests fix for BUG#72890 - Java jdbc driver returns incorrect return code when it's part of XA transaction

*

* @throws Exception

* if the test fails.

*/

public void testBug72890() throws Exception {

MysqlXADataSource myDs = new MysqlXADataSource();

myDs.setUrl(BaseTestCase.dbUrl);

try {

final Xid xid = new MysqlXid("72890".getBytes(), "72890".getBytes(), 1);

final XAConnection xaConn = myDs.getXAConnection();

final XAResource xaRes = xaConn.getXAResource();

final Connection dbConn = xaConn.getConnection();

final long connId = ((MySQLConnection) ((com.mysql.jdbc.Connection) dbConn).getConnectionMutex()).getId();

xaRes.start(xid, XAResource.TMNOFLAGS);

xaRes.end(xid, XAResource.TMSUCCESS);

assertEquals(XAResource.XA_OK, xaRes.prepare(xid));

// Simulate a connection hang and make sure the connection really dies.

this.stmt.execute("KILL CONNECTION " + connId);

int connAliveChecks = 4;

while (connAliveChecks > 0) {

this.rs = this.stmt.executeQuery("SHOW PROCESSLIST");

boolean connIsAlive = false;

while (!connIsAlive && this.rs.next()) {

connIsAlive = this.rs.getInt(1) == connId;

}

this.rs.close();

if (connIsAlive) {

connAliveChecks--;

System.out.println("Connection id " + connId + " is still alive. Checking " + connAliveChecks + " more times.");

try {

Thread.sleep(500);

} catch (InterruptedException e) {

}

} else {

connAliveChecks = -1;

}

}

if (connAliveChecks == 0) {

fail("Failed to kill the Connection id " + connId + " in a timely manner.");

}

XAException xaEx = assertThrows(XAException.class, "Undetermined error occurred in the underlying Connection - check your data for consistency",

new Callable() {

public Void call() throws Exception {

xaRes.commit(xid, false);

return null;

}

});

assertEquals("XAException error code", XAException.XAER_RMFAIL, xaEx.errorCode);

dbConn.close();

xaConn.close();

} finally {

/*

* After MySQL 5.7.7 a prepared XA transaction is no longer rolled back at disconnect. It needs to be rolled back manually to prevent test failures

* in subsequent runs.

* Other MySQL versions won't have any transactions to recover.

*/

final XAConnection xaConnRecovery = myDs.getXAConnection();

final XAResource xaResRecovery = xaConnRecovery.getXAResource();

final Xid[] xidsToRecover = xaResRecovery.recover(XAResource.TMSTARTRSCAN);

for (Xid xidToRecover : xidsToRecover) {

xaResRecovery.rollback(xidToRecover);

}

xaConnRecovery.close();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值