1、代码分析
纯java不用spring等框架,代码如下
package com.wenc.jdbc;
import org.enhydra.jdbc.standard.StandardXADataSource;
import org.objectweb.jotm.Jotm;
import javax.naming.Context;
import javax.sql.XAConnection;
import javax.transaction.Status;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
public class JOTMTest {
public static String getStatusName(int status) {
String statusName = null;
try {
Field[] flds = Status.class.getDeclaredFields();
for (int i = 0; i < flds.length; i++) {
if (flds[i].getInt(null) == status) {
statusName = flds[i].getName();
break;
}
}
} catch (Exception e) {
statusName = "invalid status value!";
}
return statusName;
}
public static Connection getConnection(TransactionManager tm, String driverName, String dbUrl, String u, String p) throws SQLException {
StandardXADataSource standardXADataSource = new StandardXADataSource();
standardXADataSource.setDriverName(driverName);
standardXADataSource.setUrl(dbUrl);
standardXADataSource.setTransactionManager(tm);
XAConnection xaconn = standardXADataSource.getXAConnection(u, p);
return xaconn.getConnection();
}
public static void main(String[] a) throws Exception {
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.ow2.carol.jndi.spi.MultiOrbInitialContextFactory");
//System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
Jotm jotm = new Jotm(true, false);
UserTransaction utx = jotm.getUserTransaction();
System.out.println(getStatusName(utx.getStatus()));
utx.begin();
System.out.println(getStatusName(utx.getStatus()));
try {
Connection conn = getConnection(jotm.getTransactionManager(), "com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1/jdbc", "root", "");
Statement statement = conn.createStatement();
statement.execute("insert into class(class_id, name) values('2012', 'jotm1')");
Connection conn2 = getConnection(jotm.getTransactionManager(), "com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1/jdbc2", "root", "");
statement = conn2.createStatement();
statement.execute("insert into class(class_id, name) values('2011', 'jotm1')");
utx.commit();
System.out.println("分布式事务成功");
} catch (Exception e) {
System.out.println("分布式事务失败:" + e);
utx.rollback();
}
System.out.println(getStatusName(utx.getStatus()));
jotm.stop();
}
}
九月 19, 2017 8:53:26 下午 org.objectweb.jotm <init>
信息: JOTM started with a local transaction factory which is not bound.
九月 19, 2017 8:53:26 下午 org.objectweb.jotm <init>
信息: CAROL initialization
STATUS_NO_TRANSACTION
STATUS_ACTIVE
分布式事务失败:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '2011' for key 'class_id_UNIQUE'
STATUS_NO_TRANSACTION
九月 19, 2017 8:53:26 下午 org.objectweb.jotm stop
信息: stop JOTM
因jdbc2库class表已存在唯一键2011,jdbc\jdbc2数据库均未插入代码中的两条数据。
2、依赖jar包
.classpath内容:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.8.0_144"/>
<classpathentry kind="lib" path="D:/搜狗高速下载/JUnit4/junit-4.11.jar"/>
<classpathentry kind="lib" path="D:/搜狗高速下载/hamcrest-core_jb51/hamcrest-core-1.3.jar"/>
<classpathentry kind="lib" path="D:/搜狗高速下载/mysql-connector-java-5.1.44/mysql-connector-java-5.1.44/mysql-connector-java-5.1.44-bin.jar"/>
<classpathentry kind="lib" path="D:/搜狗高速下载/jta-1.3.1.jar/jta-1.3.1.jar" sourcepath="D:/搜狗高速下载/jta-1.3.1.jar/jta-1.3.1.jar"/>
<classpathentry kind="lib" path="D:/搜狗高速下载/jotm.jar/jotm.jar" sourcepath="D:/搜狗高速下载/jotm.jar/jotm.jar"/>
<classpathentry kind="lib" path="D:/搜狗高速下载/xapool-1.5.0.jar"/>
<classpathentry kind="lib" path="D:/搜狗高速下载/jotm-carol.jar/jotm-carol.jar" sourcepath="D:/搜狗高速下载/jotm-carol.jar/jotm-carol.jar"/>
<classpathentry kind="lib" path="D:/搜狗高速下载/commons-logging-1.2-bin/commons-logging-1.2/commons-logging-1.2.jar"/>
<classpathentry kind="lib" path="D:/搜狗高速下载/jotm-core.jar"/>
<classpathentry kind="lib" path="D:/搜狗高速下载/javax.resource.jar/javax.resource.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>