一、获取数据源工具类
package com.terry.druid;
import javax.sql.DataSource;
import javax.sql.XADataSource;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.xa.DruidXADataSource;
public class DataSourceUtils {
enum Type {
USER, ORDERS
}
private final static String URL_USERS = "jdbc:mysql://localhost:3306/users?serverTimezone=UTC";
private final static String URL_ORDERS = "jdbc:mysql://localhost:3306/orders?serverTimezone=UTC";
private final static String USERNAME = "root";
private final static String PASSWORD = "123456";
public static DataSource getDataSource(Type type) {
DruidDataSource dataSource = new DruidDataSource();
if (type == Type.USER) {
dataSource.setUrl(URL_USERS);
} else if (type == Type.ORDERS) {
dataSource.setUrl(URL_ORDERS);
}
dataSource.setUrl(URL_USERS);
dataSource.setUsername(USERNAME);
dataSource.setPassword(PASSWORD);
return dataSource;
}
public static XADataSource getXADataSource(Type type) {
DruidXADataSource xaDataSource = new DruidXADataSource();
if (type == Type.USER) {
xaDataSource.setUrl(URL_USERS);
} else if (type == Type.ORDERS) {
xaDataSource.setUrl(URL_ORDERS);
}
xaDataSource.setUsername(USERNAME);
xaDataSource.setPassword(PASSWORD);
return xaDataSource;
}
}
二、实现代码
package com.terry.druid;
import java.sql.Connection;
import java.sql.Statement;
import javax.sql.XAConnection;
import javax.sql.XADataSource;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
import com.mysql.jdbc.jdbc2.optional.MysqlXid;
public class Test {
public static void main(String[] args) throws Exception {
XADataSource dataSource1 = DataSourceUtils.getXADataSource(DataSourceUtils.Type.ORDERS);
XAConnection conn1 = dataSource1.getXAConnection();
XAResource resource1 = conn1.getXAResource();
Connection conn11 = conn1.getConnection();
Statement stat1 = conn11.createStatement();
XADataSource dataSource2 = DataSourceUtils.getXADataSource(DataSourceUtils.Type.USER);
XAConnection conn2 = dataSource2.getXAConnection();
XAResource resource2 = conn2.getXAResource();
Connection conn22 = conn2.getConnection();
Statement stat2 = conn22.createStatement();
Xid[] xids = createXID();
Xid xid1 = xids[0];
Xid xid2 = xids[1];
int ret1 = 0;
int ret2 = 0;
String sql2 = "insert into user(name,password) values('terry', '123456')";
String sql1 = "insert into orders(user_id,order_no) values(2, 'no123456')";
resource1.start(xid1, XAResource.TMNOFLAGS);
stat1.execute(sql1);
resource1.end(xid1, XAResource.TMSUCCESS);
resource2.start(xid2, XAResource.TMNOFLAGS);
stat2.execute(sql2);
resource2.end(xid2, XAResource.TMSUCCESS);
ret1 = resource2.prepare(xid2);
ret2 = resource1.prepare(xid1);
if (ret1 == XAResource.XA_OK && ret2 == XAResource.XA_OK) {
resource1.commit(xid1, false);
resource2.commit(xid2, false);
} else {
resource1.rollback(xid1);
resource2.rollback(xid2);
}
}
static Xid[] createXID() {
Xid xid_1 = null;
byte[] gid_1 = new byte[1];
byte[] bid_1 = new byte[1];
gid_1[0] = (Byte.decode("0x01").byteValue());
bid_1[0] = (Byte.decode("0x02").byteValue());
xid_1 = new MysqlXid(gid_1, bid_1, 0);
Xid xid_2 = null;
byte[] gid_2 = new byte[1];
byte[] bid_2 = new byte[1];
gid_2[0] = (Byte.decode("0x01").byteValue());
bid_2[0] = (Byte.decode("0x03").byteValue());
xid_2 = new MysqlXid(gid_2, bid_2, 0);
return new Xid[]{xid_1, xid_2};
}
private static void insertUser() throws Exception {
Connection conn = DataSourceUtils.getDataSource(DataSourceUtils.Type.USER).getConnection();
Statement stat = conn.createStatement();
String sql = "insert into user(name,password) values('terry', '123456')";
stat.execute(sql);
}
private static void insertOrder() throws Exception {
Connection conn = DataSourceUtils.getDataSource(DataSourceUtils.Type.ORDERS).getConnection();
Statement stat = conn.createStatement();
String sql = "insert into orders(user_id,order_no) values(2, 'no123456')";
stat.execute(sql);
}
}
三、总结
1、分布式事务完全自己手工控制
2、commit、rollback都是自己控制
3、一个失败,都全部回滚