InnoDB存储引擎--3、分布式事务XA

package p.zzq.xa;


import java.sql.SQLException;
import java.sql.Statement;


import javax.sql.XAConnection;
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;


import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;


/**
 * MySQL数据库分布式事务
 *
 * 是否启用了XA事务的支持:SHOW VARIABLES LIKE 'innodb_support_xa';
 * 
 * 数据表account:
 * CREATE TABLE account (
user_id INT NOT NULL,
money INT NOT NULL DEFAULT 0,
PRIMARY KEY(`user_id`)
)ENGINE=INNODB


bank_shanghai.account数据:(1, 10000)
bank_beijing.account数据:(2, 0)


 * @author U-Demon Created on 2017年9月7日 下午4:12:15
 * @version 1.0.0
 */
public class MyXA {

public void start() {
String conn1 = "jdbc:mysql://192.168.0.200:3306/bank_shanghai";
String conn2 = "jdbc:mysql://192.168.0.300:3306/bank_beijing";
MysqlXADataSource ds1 = getDataSource(conn1, "root", "password");
MysqlXADataSource ds2 = getDataSource(conn2, "root", "password");
try {
XAConnection xac1 = ds1.getXAConnection();
XAResource xar1 = xac1.getXAResource();
Statement stmt1 = xac1.getConnection().createStatement();

XAConnection xac2 = ds2.getXAConnection();
XAResource xar2 = xac2.getXAResource();
Statement stmt2 = xac2.getConnection().createStatement();

Xid xid1 = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
Xid xid2 = new MyXid(100, new byte[]{0x11}, new byte[]{0x12});

xar1.start(xid1, XAResource.TMNOFLAGS);
stmt1.execute("update account set money = money-3000 where user_id = 1");
xar1.end(xid1, XAResource.TMSUCCESS);

xar2.start(xid2, XAResource.TMNOFLAGS);
stmt2.execute("update account set money = money+3000 where user_id = 2");
xar2.end(xid2, XAResource.TMSUCCESS);

int ret2 = xar2.prepare(xid2);
int ret1 = xar1.prepare(xid1);
if (ret1 == XAResource.XA_OK && ret2 == XAResource.XA_OK) {
xar1.commit(xid1, false);
xar2.commit(xid2, false);
}
} catch (SQLException | XAException e) {
e.printStackTrace();
}
}

private MysqlXADataSource getDataSource(String url, String user, String pwd) {
MysqlXADataSource ds = new MysqlXADataSource();
ds.setUrl(url);
ds.setUser(user);
ds.setPassword(pwd);
return ds;
}

private static class MyXid implements Xid {


public int formatId;
public byte[] gtrid;
public byte[] bqual;

public MyXid(int formatId, byte[] gtrid, byte[] bqual) {
this.formatId = formatId;
this.gtrid = gtrid;
this.bqual = bqual;
}

@Override
public byte[] getBranchQualifier() {
return this.bqual;
}


@Override
public int getFormatId() {
return this.formatId;
}


@Override
public byte[] getGlobalTransactionId() {
return this.gtrid;
}

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值