`

(转)JTA事务处理

    博客分类:
  • EJB
阅读更多

事务简介
  一般情况下,J2EE应用服务器支持JDBC事务、JTA(Java Transaction API)事务(一般由容器来进行管理)。通常,最好不要在程序中同时使用上述三种事务类型,比如在JTA事务中嵌套JDBC事务。第二方面,事务要在尽可能短的时间内完成,不要在不同方法中实现事务的使用(事务的嵌套要求更加良好的设计)。

JDBC事务
  在JDBC中怎样将多个SQL语句组合成一个事务呢?在JDBC中,打开一个连接对象Connection时,缺省是auto-commit模式,每个SQL语句都被当作一个事务,即每次执行一个语句,都会自动的得到事务确认。为了能将多个SQL语句组合成一个事务,要将auto-commit模式屏蔽掉。在auto-commit模式屏蔽掉之后,如果不调用commit()方法,SQL语句不会得到事务确认。在最近一次commit()方法调用之后的所有SQL会在方法commit()调用时得到确认。例如下面的代码:
/**
* 测试Jboss中的JDBC事务
* <p>@author javer QQ:84831612</p>
* @date 2005
*/
jjava.sql.Connection conn = null;
try{
javax.sql.DataSource ds = (javax.sql.DataSource) context.lookup("java:/OracleDS");
conn = ds.getConnection();
conn.setAutoCommit(false);
java.sql.Statement statement = conn.createStatement();
/**
*
* 数据库操作
*
*/
conn.commit();
} catch (Exception e) {
if(conn!=null)
try{conn.rollback();}catch(Exception e1){out.println("catch:事务回滚失败!<br />");}
out.println("catch:" + e.getClass() + ";" + e.getMessage()+"<br />");
}finally{
if(conn!=null)
try{conn.close();}catch(Exception e1){out.println("finally:关闭数据库连接失败!<br />");}
}
  毕竟JDBC事务大多数程序员可能经常使用,而且比较相对简单,就不作过多的描述了

 

 

JTA (XA)事务
  Java 事务 API(JTA) 及其同门兄弟 Java 事务服务(Java Transaction Service JTS)为 J2EE 平台提供了分布式事务服务。一个分布式的事务涉及一个事务管理器和一个或者多个资源管理器。一个资源管理器是任何类型的持久性的数据存储。事务管理器负责协调所有事务参与者之间的通信。
  与本地事务相比,XA 协议的系统开销相当大,因而应当慎重考虑是否确实需要分布式事务。只有支持 XA 协议的资源才能参与分布式事务。如果事务须登记一个以上的资源,则需要实现和配置所涉及的资源(适配器、JMS 或 JDBC 连接池)以支持 XA。

JTA事务工作流程
  WEB服务器(比如:WebLogic Server)将根据以下条件返回不同种类的包装器:

    1、所使用的 JDBC 驱动程序类是否支持 XA
    2、是从 DataSource 还是从 TxDataSource 获得连接
    3、调用 getConnection() 时是否在事务内运行
    4、是否通过 RMI 从远程获得连接

  决定返回哪种包装器的算法的工作方式如下:

 

JTA实例代码
/**
* 测试Jboss中的JTA事务
* <p>@author javer QQ:84831612</p>
* @date 2005
*/
javax.transaction.UserTransaction tx = null;
java.sql.Connection conn = null;
try{
tx = (javax.transaction.UserTransaction) context.lookup("java:comp/UserTransaction");  //取得JTA事务,本例中是由Jboss容器管理
javax.sql.DataSource ds = (javax.sql.DataSource) context.lookup("java:/XAOracleDS");  //取得数据库连接池,必须有支持XA的数据库、驱动程序
tx.begin();
conn = ds.getConnection();
//conn.setAutoCommit(false);
java.sql.Statement statement = conn.createStatement();
String sql = "insert into testtable (cell1,cell2,cell3,cell4) values('"+System.currentTimeMillis()+"','','','')";
int insert = statement.executeUpdate(sql);
//conn.commit();  //JTA事务中不要嵌套JDBC事务啦!!!重要,切记,否则会抛出异常!!!
out.println("插入了" + insert + "行记录!<br />");
if(true)throw new Exception("故意抛出的异常!");
int num = statement.executeUpdate("delete testtable");
out.println("删除了" + num + "行记录!<br />");
tx.commit();
} catch (Exception e) {
if(tx!=null)
try{tx.rollback();}catch(Exception e1){out.println("catch:事务回滚失败!<br />");}
out.println("catch:" + e.getClass() + ";" + e.getMessage()+"<br />");
}finally{
if(conn!=null)
try{conn.close();}catch(Exception e1){out.println("finally:关闭数据库连接失败!<br />");}
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/muzijie927/archive/2006/10/27/1353307.aspx

分享到:
评论

相关推荐

    事务处理:JTA事务

    JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。  要用 JTA 进行事务界定,应用程序要调用 javax.transaction.UserTransaction 接口中的方法。

    Spring配置JTA事务管理

    Spring框架在企业级Java应用中广泛用于实现事务管理,而JTA(Java Transaction API)是Java平台上的标准事务处理API,适用于分布式环境。本篇文章将深入探讨如何在Spring中配置JTA事务管理,以实现跨数据库和资源的...

    JTA分布式事务使用示例代码

    JTA(Java Transaction API)是Java平台上的一个标准接口,用于处理分布式事务,它允许应用程序在不同的数据源之间进行协调,确保事务的ACID特性(原子性、一致性、隔离性和持久性)。本示例代码旨在展示如何在Java...

    JTA事务源码示例

    如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,欢迎下载传播。有问题请在评价中...

    springboot整合JTA组件,多数据源事务管理

    JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序对JTA的支持极大地增强了数据访问能力。 XA协议是数据库层面的一套分布式事务管理...

    JDBC事务 JTA事务 传播特性 隔离级别

    在2PC中,事务处理监视器(TPM)先询问所有资源管理器(如数据库)是否准备好提交,然后再决定全局提交或回滚。JTA事务更复杂,但能保证分布式事务的一致性。 最后,我们提到的是**事务的传播特性**,这是Spring...

    Spring+iBatis+JOTM实现JTA事务

    5. **事务处理** - 在业务逻辑代码中,可以通过Spring的`@Transactional`注解标记方法,使方法运行在事务中。 - 如果事务涉及多个数据源的操作,JOTM会确保这些操作在同一个事务中完成,即使涉及到不同的数据库,...

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

    在JTA分布式事务的场景下,iBATIS作为数据访问层,参与到事务处理中,其执行的SQL操作会受到JTA的控制,确保在事务中的所有数据库操作要么全部成功,要么全部回滚。 MySQL是广泛使用的开源关系型数据库管理系统,它...

    Springboot 动态多数据源 jta分布式事务

    Spring Boot支持JTA事务管理,主要通过以下组件实现: 1. Atomikos:这是一个开源的JTA实现,提供了一种在Spring Boot中实现分布式事务的方式。 2. Bitronix:另一种JTA实现,也可以与Spring Boot集成,处理分布式...

    在Spring中使用JTA事务管理

    本文将详细介绍如何在Spring中使用JTA事务管理,包括通过集成JOTM(Java Open Transaction Manager)以及引用Tomcat的JTA事务。 ### 1. 通过集成JOTM,直接在Spring中使用JTA事务 #### 1.1. 添加JOTM类库到类路径...

    Spring Boot+Druid+Mybatis实现JTA分布式事务

    在IT行业中,尤其是在大型分布式系统开发中,事务处理是至关重要的。本教程将详细讲解如何使用Spring Boot、Druid和Mybatis来实现JTA(Java Transaction API)分布式事务。这是一项高级技术,它允许在多数据库环境...

    多数据源事务jta测试

    1. **配置数据源**:为每个数据库创建独立的数据源,并确保它们支持JTA事务。 2. **注册XAResource**:将每个数据源作为XAResource注册到事务协调器。 3. **开始事务**:通过UT接口启动一个新的全局事务。 4. **执行...

    Atomikos jta事务框架改写历程

    Atomikos 是一个开源的Java事务处理服务(JTA)实现,它提供了强大的事务管理能力,适用于独立的应用程序以及Web应用服务器。本文将深入探讨在改写过程中遇到的问题以及解决方案。 在原有API中,JTA事务由Resin Web...

    Springboot+Atomikos+Jpa+Mysql实现JTA分布式事务

    在IT行业中,分布式事务处理是复杂系统架构中的一个重要环节,特别是在微服务架构中,确保数据的一致性至关重要。本文将详细讲解如何利用Spring Boot、Atomikos、JPA(Java Persistence API)以及MySQL来实现JTA...

    springboot整合jta实现多数据源事务管理

    - 使用`@EnableJtaTransactionManagement`注解开启JTA事务管理。 5. **编写代码**: - 在需要进行多数据源事务操作的服务类上,使用`@Transactional`注解声明事务边界。 - 在事务方法内部,根据业务逻辑切换数据...

    Jboss4.2.2+Spring2.5.6+hibernate+JTA事务的实现

    这些技术的结合能够提供强大的服务管理和数据持久化能力,同时支持分布式事务处理。 **JBoss 4.2.2** 是一个流行的开源Java应用服务器,它提供了运行和管理Java EE应用程序的平台。这个版本支持EJB 3.0,JPA,JMS等...

    第二部分spring+hibernate+jta 分布式事务Demo

    在IT行业中,分布式事务处理是复杂系统架构中的关键一环,特别是在大型企业级应用和微服务环境中。Spring框架以其强大的依赖注入和AOP(面向切面编程)能力,成为Java开发中的主流选择。Hibernate作为ORM(对象关系...

    使用JTA实现跨库事务

    在提供的"SimpleDemo"示例中,可能包含了一个简单的JTA事务管理的例子,比如如何在Java代码中启动和结束一个事务,以及如何在事务中操作数据库。具体实现细节可能包括使用JPA、JDBC或其他持久化框架与JTA集成的方法...

    多数据源事务之解决方案jta+atomikos

    使用JTA和Atomikos进行多数据源事务处理的过程通常包括以下几个步骤: 1. **初始化**: 应用程序配置Atomikos,包括设置事务超时时间、配置数据源等。 2. **开始事务**: 通过UserTransaction接口开始一个全局事务,...

    分布式事务操作之Spring+JTA+mybatis源码

    1. **分布式事务**:在分布式系统中,事务处理跨越多个资源或服务,例如数据库、消息队列等。分布式事务的目标是提供与单体事务一样的ACID(原子性、一致性、隔离性和持久性)特性,确保事务操作的正确性。 2. **...

Global site tag (gtag.js) - Google Analytics