import java.sql.Connection;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import org.enhydra.jdbc.standard.StandardXADataSource;
import org.hsqldb.Server;
import org.objectweb.jotm.Jotm;
import org.springframework.jdbc.core.JdbcTemplate;
public class XADataSourceTest {
public static void main(String[] args) throws Exception {
startDataBase();
//创建JTA的UserTransaction和TransactionManager。
//下面会使用UserTransaction进行事务的提交和回滚。
//TransactionManager用来管理事务源。
Jotm jotm = new Jotm(true, false);
TransactionManager transactionManager = jotm.getTransactionManager();
UserTransaction utx = jotm.getUserTransaction();
//创建一个分布式数据源 XADataSource
StandardXADataSource dataSource1 = new StandardXADataSource();
dataSource1.setDriverName("org.hsqldb.jdbcDriver");
dataSource1.setUser("sa");
dataSource1.setUrl("jdbc:hsqldb:testdb1");
//将该数据源加入到TransactionManager管理范围内
dataSource1.setTransactionManager(transactionManager);
StandardXADataSource dataSource2 = new StandardXADataSource();
dataSource2.setDriverName("org.hsqldb.jdbcDriver");
dataSource2.setUser("sa");
dataSource2.setUrl("jdbc:hsqldb:testdb2");
dataSource2.setTransactionManager(transactionManager);
//得到两个分布式Connection
Connection cn1 = dataSource1.getXAConnection().getConnection();
Connection cn2 = dataSource2.getXAConnection().getConnection();
try{
cn1.createStatement().execute("DROP TABLE table1");
cn2.createStatement().execute("DROP TABLE table2");
}catch(Exception e){}
cn1.createStatement().execute("CREATE TABLE table1(id int primary key, money int)");
cn2.createStatement().execute("CREATE TABLE table2(id int primary key, money int)");
//插入初始数据。
cn1.createStatement().execute("INSERT INTO table1 VALUES(1, 50)");
cn2.createStatement().execute("INSERT INTO table2 VALUES(1, 50)");
utx.begin();
try{
cn1.createStatement().execute("UPDATE table1 SET money=money-10 WHERE id=1");
cn2.createStatement().execute("UPDATE table2 SET money=money+10 WHERE id=1");
//模拟抛出一个业务异常
int a = 1 / 0;
utx.commit();
}catch(Exception e) {
utx.rollback();
}
System.out.println(new JdbcTemplate(dataSource1).queryForInt("SELECT money FROM table1 WHERE id=1"));
System.out.println(new JdbcTemplate(dataSource2).queryForInt("SELECT money FROM table2 WHERE id=1"));
}
//启动HSQL,其中有两个数据库testdb1和testdb2。
private static void startDataBase() {
Server.main(new String[]{"-database.0", "hsqldb/testdb1", "-dbname.0", "testdb1", "-database.1", "hsqldb/testdb2", "-dbname.1", "testdb2"});
}
}
运行结果为:
50
50
说明事务回滚了。
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;
import org.enhydra.jdbc.standard.StandardXADataSource;
import org.hsqldb.Server;
import org.objectweb.jotm.Jotm;
import org.springframework.jdbc.core.JdbcTemplate;
public class XADataSourceTest {
public static void main(String[] args) throws Exception {
startDataBase();
//创建JTA的UserTransaction和TransactionManager。
//下面会使用UserTransaction进行事务的提交和回滚。
//TransactionManager用来管理事务源。
Jotm jotm = new Jotm(true, false);
TransactionManager transactionManager = jotm.getTransactionManager();
UserTransaction utx = jotm.getUserTransaction();
//创建一个分布式数据源 XADataSource
StandardXADataSource dataSource1 = new StandardXADataSource();
dataSource1.setDriverName("org.hsqldb.jdbcDriver");
dataSource1.setUser("sa");
dataSource1.setUrl("jdbc:hsqldb:testdb1");
//将该数据源加入到TransactionManager管理范围内
dataSource1.setTransactionManager(transactionManager);
StandardXADataSource dataSource2 = new StandardXADataSource();
dataSource2.setDriverName("org.hsqldb.jdbcDriver");
dataSource2.setUser("sa");
dataSource2.setUrl("jdbc:hsqldb:testdb2");
dataSource2.setTransactionManager(transactionManager);
//得到两个分布式Connection
Connection cn1 = dataSource1.getXAConnection().getConnection();
Connection cn2 = dataSource2.getXAConnection().getConnection();
try{
cn1.createStatement().execute("DROP TABLE table1");
cn2.createStatement().execute("DROP TABLE table2");
}catch(Exception e){}
cn1.createStatement().execute("CREATE TABLE table1(id int primary key, money int)");
cn2.createStatement().execute("CREATE TABLE table2(id int primary key, money int)");
//插入初始数据。
cn1.createStatement().execute("INSERT INTO table1 VALUES(1, 50)");
cn2.createStatement().execute("INSERT INTO table2 VALUES(1, 50)");
utx.begin();
try{
cn1.createStatement().execute("UPDATE table1 SET money=money-10 WHERE id=1");
cn2.createStatement().execute("UPDATE table2 SET money=money+10 WHERE id=1");
//模拟抛出一个业务异常
int a = 1 / 0;
utx.commit();
}catch(Exception e) {
utx.rollback();
}
System.out.println(new JdbcTemplate(dataSource1).queryForInt("SELECT money FROM table1 WHERE id=1"));
System.out.println(new JdbcTemplate(dataSource2).queryForInt("SELECT money FROM table2 WHERE id=1"));
}
//启动HSQL,其中有两个数据库testdb1和testdb2。
private static void startDataBase() {
Server.main(new String[]{"-database.0", "hsqldb/testdb1", "-dbname.0", "testdb1", "-database.1", "hsqldb/testdb2", "-dbname.1", "testdb2"});
}
}
运行结果为:
50
50
说明事务回滚了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10742815/viewspace-589259/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10742815/viewspace-589259/