分布式事务-两阶段提交

来源:互联网 发布:mysql显示当前时间指令 编辑:程序博客网 时间:2024/05/16 05:41

一、获取数据源工具类

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、一个失败,都全部回滚

0 0
原创粉丝点击