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("连接关闭失败");
}
}
}
这里测试的是 如果两个操作都成功了就回滚, 实现了这样的功能。不过运用到实际程序中还需要更改。
分享到:
相关推荐
spring boot下学习mybatis+mysql使用jta对多数据源事务进行整合
代码下载下来,想要了解更多相关内容可以看http://www.cnblogs.com/shamo89/p/7307961.html
JTA分布式事务处理多数据事务问题的示例代码。
在Spring中使用JTA事务管理 1 通过集成JOTM,直接在Spring中使用JTA事务 1.1. 将JOTM以下类库添加到类路径中 1.2. 编写JOTM配置文件,放到类路径下 1.3. 在MySQL上建立两个数据库 1.4. 在Spring配置文件中配置JOTM ...
jta使用手册,jta帮助文档jta使用手册,jta帮助文档jta使用手册,jta帮助文档jta使用手册,jta帮助文档jta使用手册,jta帮助文档jta使用手册,jta帮助文档jta使用手册,jta帮助文档jta使用手册,jta帮助文档jta使用手册,jta...
myeclipse开发,导入即可用,可以参阅http://www.cnblogs.com/shamo89/p/7326718.html
jta Springboot + Atomikos + Druid + Mysql 实现JTA分布式事务 问题一:Druid 和 Mysql 版本的问题 问题二:Springtest 默认情况下事务回滚 Mysql对XA协议支持不好,有待看
Spring boot+Atomikos+JTA+Hibernate+MySQL实现分布式事务+多数据源,分别向两个不同的数据里面插入数据同时失败和成功,调用接口方式原理一样。
EJB中的JTA与JTS例子代码,JTA是一种高层的,与实现无关的,与协议无关的J2ee API,应用程序和应用服务器可以使用JTA来访问事务。JTS则规定了支持JTA的事务管理器的实现规范,在高层API之下实现了OMG Object ...
NULL 博文链接:https://andilyliao.iteye.com/blog/1730545
NULL 博文链接:https://ajita.iteye.com/blog/2023951
jta.jar包;jta.jar包
springboot+jta+atomikos Springboot+atomikos+jta实现分布式事务统一管理
最近往javaEE项目中集成quartz2.2.1时,要用到jta的jar包,下载了最新版的jta-4.0.jar后,发现不能使用,于是又下载了1.1和1.3.1版本的jar包,比较了一下,发现4.0版本的jar包,包名跟以前版本的不一样。quartz2.2.1...
atomikos实现多数据源支持分布式事务管理(spring、tomcat、JTA) 结合spring 和durid进行配置,
springboot+Atomikos+jpa+mysql的JTA分布式事务实现,本案例涉及到2个数据库,预期结果,在同一个事务中,两个库的状态一致
最新的JTA规范.(英文版)学习ejb的必备手册
JTA1.2Specification, JTA1.2规范
Spring+iBatis+JOTM实现JTA事务: 如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,...
jta-api.jar