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
    评论
Spring+iBatis+JOTM实现JTA事务: 如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,欢迎下载传播。有问题请在评价中留言,我会及时回复的。 <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/> <!-- JTA事务管理器 --> <bean id="myJtaManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="userTransaction"> <ref local="jotm"/> </property> </bean> <!-- 数据源A --> <bean id="dataSourceA" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"> <property name="dataSource"> <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"> <property name="transactionManager" ref="jotm"/> <property name="driverName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> </bean> </property> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- 数据源B --> <bean id="dataSourceB" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"> <property name="dataSource"> <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"> <property name="transactionManager" ref="jotm"/> <property name="driverName" value="${jdbc2.driver}"/> <property name="url" value="${jdbc2.url}"/> </bean> </property> <property name="user" value="${jdbc2.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- 事务切面配置 --> <aop:config> <aop:pointcut id="serviceOperation" expression="execution(* *..servi1ce*..*(..))"/> <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/> </aop:config> <!-- 通知配置 --> <tx:advice id="txAdvice" transaction-manager="myJtaManager"> <tx:attributes> <tx:method name="delete*" rollback-for="Exception"/> <tx:method name="save*" rollback-for="Exception"/> <tx:method name="update*" rollback-for="Exception"/> <tx:method name="*" read-only="true" rollback-for="Exception"/> </tx:attributes> </tx:advice ...... ...... ......

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值