`

使用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

说明事务回滚了。
分享到:
评论

相关推荐

    使用JOTM实现分布式事务管理(多数据源)

    这篇博客文章“使用JOTM实现分布式事务管理(多数据源)”将深入探讨如何利用JOTM来处理复杂的分布式环境中的事务。 首先,理解JTA是至关重要的。JTA是Java平台的标准,定义了API,使得应用开发者可以控制跨数据库、...

    JOTM配置分布式事务

    本文详细介绍了如何使用 JOTM 来管理跨多个数据源的分布式事务。通过合理的配置和编码实践,我们可以轻松地实现在不同数据源间保持事务一致性的目标。此外,还介绍了如何使用 Spring 的 `@Transactional` 注解简化...

    spring + JTA + JOTM实现分布式事务

    本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java Open Transaction Manager (JOTM) 来实现这样的分布式事务管理。 首先,我们来了解一下JTA。JTA是Java平台的标准事务API,它允许应用程序...

    Spring+JOTM 分布式事务管理

    Spring框架作为一个广泛使用的Java应用程序开发框架,提供了多种支持事务管理的解决方案,其中包括集成JOTM(Java Open Transaction Manager)来处理分布式事务。本文将深入探讨Spring与JOTM结合使用的知识点,帮助...

    jta分布式事务完成例子,测试通过

    例子虽小,可覆盖面广,设计spring载入.properties文件,spring配置jta和jotm分布式事务,设置数据源连接池,注解事务驱动。功能是在mysql上建立了两个数据库分别为dbone和dbtwo,在dbone里有表tb1,表中只有一个字段...

    spring+jotm+ibatis+mysql实现JTA分布式事务

    本项目“spring+jotm+ibatis+mysql实现JTA分布式事务”旨在利用这些技术来确保在分布式环境中的数据一致性。下面将详细介绍这个项目所涉及的知识点。 首先,Spring框架是Java开发中最常用的应用框架之一,它提供了...

    Spring分布式事务实现

    在Spring中,当需要处理分布式事务时,可以使用PlatformTransactionManager接口的实现,例如JtaTransactionManager,它是基于JTA的。Spring会自动检测到`jotm.properties`配置文件,并自动配置JOTM作为事务管理器。`...

    spring JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)

    2. **配置JNDI**:在Tomcat的`server.xml`文件中添加一个全局JNDI资源,定义JOTM事务管理器。 3. **Spring配置**:在Spring的配置文件中,使用`jee:jta-data-source`或`jee:resource-ref`元素来引用之前创建的JNDI...

    使用jotm实现跨数据库事务控制

    【使用JOTM实现跨数据库事务控制】 在分布式系统中,常常需要对多个数据库进行操作,确保数据的一致性。JOTM(Java Open Transaction Manager)是一个开源的Java事务管理器,它支持JTA(Java Transaction API),...

    JOTM 分布式事务初探(JNDI,Tomcat 7 JDBC Pool连接池)

    NULL 博文链接:https://jackyin5918.iteye.com/blog/1922379

    开源分布式事务管理Jtom

    【标题】"开源分布式事务管理Jtom"是一个关键的话题,主要关注的是在Java环境中...开发者可以通过阅读"jotm.pdf"来深入理解Jtom的工作原理和使用方法,将其有效地应用于实际项目中,以解决分布式环境下的事务处理问题。

    Spring+iBatis+JOTM实现JTA事务

    - 配置JOTM事务管理器,通过`UserTransaction`接口进行事务的开始、提交和回滚。 - 使用`PlatformTransactionManager`接口配置Spring的声明式事务管理,设置事务传播属性、隔离级别和超时时间。 4. **iBatis配置*...

    Spring+Jotm+Hibernate+Oracle+Junit 实现JTA分布式事务要求Demo工程

    2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的...

    分布式事务的介绍

    而在Tomcat等轻量级服务器中,则需要借助外部框架如Jotm、Atomikos来实现分布式事务。 **特点**: - 实现相对简单,适用于单体应用中跨库操作的需求。 - 对性能影响较大,不适合高并发场景。 #### 四、本地消息表...

    jotm资源包

    这个资源包包含了JOTM的核心组件以及相关的配置和示例文件,对于理解和使用JOTM进行分布式事务处理至关重要。 在Java应用程序中,事务管理是确保数据一致性、完整性和可靠性的关键部分。JTA作为Java平台的标准接口...

    Java分布式开发spring+jta+jotm

    在Spring中,Java Transaction API (JTA) 和 JOTM(Java Open Transaction Manager)是实现分布式事务管理的关键组件。 **Spring 框架** Spring 是一个开源的Java平台,它提供了一个全面的编程和配置模型,用于现代...

    spring 3.0.5 + jotm 实现的的spring mvc 的例子

    标题中的“spring 3.0.5 + jotm 实现的的spring mvc 的例子”表明这是一个关于使用Spring 3.0.5版本与JOTM(Java Open Transaction Manager)结合构建Spring MVC应用的示例项目。这个项目可能旨在演示如何在Spring ...

Global site tag (gtag.js) - Google Analytics