mysql使用JTA实例

JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。
测试使用的jdk中自带了javax.transaction和javax.transaction.xa
参考http://blog.csdn.net/turkeyzhou/archive/2008/10/13/3071683.aspx 该文章后自己修改的程序的测试


import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;

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

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

public class JTATest {

/**
* @param args
*/
public static void main(String[] args) {
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
XADataSource xaDs1=JTATest.getDataSource("jdbc:mysql://192.168.*.*:3306/mx2", "root", "root");
XAConnection xaCon1=null;
XAResource xaRes1 = null;
Connection conn1=null;
Statement stmt1 =null;


XADataSource xaDs2=JTATest.getDataSource("jdbc:mysql://192.168.*.*:3306/mx1", "root", "root");
XAConnection xaCon2=null;
XAResource xaRes2 = null;
Connection conn2=null;
Statement stmt2 =null;

int ret1=0;
int ret2=0;

Xid xid1=new MyXid(100,new byte[]{0x01}, new byte[]{0x02});
Xid xid2=new MyXid(100, new byte[]{0x01}, new byte[]{0x03});
try {
xaCon1 = JTATest.getXAConnetion(xaDs1);
conn1= JTATest.getConnection(xaCon1);
stmt1=conn1.createStatement();
xaRes1=xaCon1.getXAResource();

xaCon2 = JTATest.getXAConnetion(xaDs2);
conn2= JTATest.getConnection(xaCon2);
stmt2=conn2.createStatement();
xaRes2=xaCon2.getXAResource();

xaRes1.start(xid1, XAResource.TMNOFLAGS);
stmt1.execute("INSERT INTO mx_user (uid,name,add_time) VALUES (148,'aaabbb','"+dateFormat.format(new Date())+"')");
xaRes1.end(xid1, XAResource.TMSUCCESS);

if (xaRes2.isSameRM(xaRes1)) {
xaRes2.start(xid1, XAResource.TMNOFLAGS);
stmt2.execute("INSERT INTO mx_user (uid,name,add_time) VALUES (148,'aaabbb','"+dateFormat.format(new Date())+"')");
xaRes2.end(xid1, XAResource.TMSUCCESS);
}else{

xaRes2.start(xid2, XAResource.TMNOFLAGS);
stmt2.execute("INSERT INTO mx_user (uid,name,add_time) VALUES ('148','aaabbb','"+dateFormat.format(new Date())+"')");
xaRes2.end(xid2, XAResource.TMSUCCESS);
ret1=xaRes2.prepare(xid2);
// if (ret==XAResource.XA_OK) {
// xaRes2.commit(xid2, false);
// }
}
ret2 = xaRes1.prepare(xid1);
if (ret1 == XAResource.XA_OK&&ret2==XAResource.XA_OK) {
//xaRes1.commit(xid1, false);
xaRes1.rollback(xid1);
if (xaRes2.isSameRM(xaRes1)) {
xaRes2.rollback(xid1);
}else{
xaRes2.rollback(xid2);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XAException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


private static XADataSource getDataSource(String url,String user,String password) {
// TODO Auto-generated method stub
MysqlXADataSource dataSource = new MysqlXADataSource();
dataSource.setUrl(url);
dataSource.setUser(user);
dataSource.setPassword(password);
return dataSource;
}


public static XAConnection getXAConnetion(XADataSource dataSource) {
XAConnection XAConn = null;
try {
XAConn = dataSource.getXAConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return XAConn;
}

public static Connection getConnection(XAConnection XAConn) {
Connection conn = null;
try {
conn = XAConn.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}

public static void closeConnection(Connection conn) {
try {
conn.close();
} catch (SQLException e) {
System.out.println("连接关闭失败");
}
}

}




这里测试的是 如果两个操作都成功了就回滚, 实现了这样的功能。不过运用到实际程序中还需要更改。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值