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

来源:互联网 发布:中老年妈妈装淘宝网 编辑:程序博客网 时间:2024/06/08 04:06
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;
}

}


}
原创粉丝点击