使用JOTM实现分布式事务的例子

使用JOTM实现分布式事务的例子
发布时间:2009/4/18 11:55:07 | 32 人感兴趣 | 0 人参与 | 评分:3
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

说明事务回滚了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值