JDBC 事务和 JTA 事务的区别

本文转载自:原文链接

一、事务概述

事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,其中的操作要么全做要么全都不做。

与事务相关的操作主要有:

  • BEGIN TRANSACTION; 开始一个事务,方法是:begin()
  • COMMIT;       提交一个事务,方法是:commit()
  • ROLLBACK;      回滚一个事务,方法是:rollback()
  • PREPARE;      准备提交一个事务,方法是:prepare()
二、事务的特性(ACID)

1、原子性:同一个事务的操作要么全部成功执行,要么全部撤消
2、隔离性:事务的所有操作不会被其它事务干扰
3、一致性:在操作过程中不会破坏数据的完整性
4、时效性 :事务的结果必须持久保存于介质上

三、事务处理方式

在 JDBC 连接中,使用命令声明事务的开始、提交和取消。数据库处理方式,是通过java.sql.Connection 接口实现,可以启用 AutoCommit。这种方式使用简单,但性能较低。

利用 JavaEE 规范的 JTA 驱动程序。这种方式性能更好,是 EJB 和 JMS 的常用方式。

Java EE 的分布式事务服务包括5个层次:
事务管理器、应用服务器、资源管理器、应用程序、通信资源管理器。

  • 事务管理器:完成事务管理
  • 应用服务器:为应用提供服务
  • 资源管理器:连接相应的资源
  • 应 用程 序:需要使用事务的应用
  • 通信资源管理器:接收事务、传播事务
四、JDBC 和 JTA 事务区别

简单的说 jta 是多库的事务 jdbc 是单库的事务

(一)JDBC 事务:

JDBC 事务由 Connnection 对象控制管理,也就是说,事务管理实际上是在 JDBC Connection 中实现。事务周期限于 Connection 的生命周期。JDBC Connection 接口( java.sql.Connection ) 提供了两种事务模式:自动提交和手工提交

自动提交: 缺省是自动提交。一条对数据库的更新(增/删/改)代表一项事务操作,操作成功后,系统将自动调用 commit() 来提交,否则将调用 rollback() 来回滚。

手工提交: 通过调用 setAutoCommit(false) 来禁止自动提交。这样就可把多个数据库操作的表达式作为一个事务,在操作完成后调 用 commit() 来进行整体提交,其中任何一个操作失败,都不会执行到 commit(),并产生异常;此时可在异常捕获时调用 rollback() 进行回滚,以保持多次更新操作后,相关数据的一致性,示例如下:

try {
    conn = DriverManager.getConnection(...);

	//禁止自动提交,设置回滚点
    conn.setAutoCommit(false);
    stmt = conn.createStatement();

	//数据库更新操作1
    stmt.executeUpdate(...); 
    //数据库更新操作2
    stmt.executeUpdate(...); 
    
	//事务提交
    conn.commit(); 
    
}catch(Exception ex) {

    log.error(...);
    try {
    	//操作不成功则回滚
        conn.rollback(); 
    }catch(Exception e) {
        log.error(...);
    }
}

JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。

(二)JTA 事务:

JTA(Java Transaction API) 提供了跨数据库连接(或其他 JTA 资源)的事务管理能力。JTA 事务管理则由 JTA 容器实现,JavaEE 框架中事务管理器与应用程序,资源管理器,以及应用服务器之间的事务通讯。

(1)JTA 的构成

  • a、高层应用事务界定接口,供事务客户界定事务边界的
  • b、X/Open XA 协议(资源之间的一种标准化的接口)的标准Java映射,它可以使事务性的资源管理器参与由外部事务管理器控制的事务中
  • c、高层事务管理器接口,允许应用程序服务器为其管理的应用程序界定事务的边界

(2)JTA 的主要接口位于 javax.transaction 包中

  • a、UserTransaction 接口:让应用程序得以控制事务的开始、挂起、提交、回滚等。由Java客户端程序或EJB调用。
  • b、TransactionManager 接口:用于应用服务器管理事务状态
  • c、Transaction 接口:用于执行相关事务操作
  • d、XAResource 接口:用于在分布式事务环境下,协调事务管理器和资源管理器的工作
  • e、Xid 接口:为事务标识符的 Java 映射

注:前3个接口位于 Java EE 版的类库 javaee.jar 中,Java SE 中没有提供!UserTransaction 是编程常用的接口

注意的是 JTA 只提供了接口,没有具体的实现。

JTS(Java Transaction Service) 是服务 OTS 的 JTA 的实现。简单的说 JTS 实现了 JTA 接口,并且符合OTS的规范。

JTA 的事务周期可横跨多个 JDBC Connection 生命周期,对众多 Connection 进行调度,实现其事务性要求。

JTA 可以处理任何提供符合 XA 接口的资源。包括:JDBC 连接,数据库,JMS,商业对象等等。

(3)JTA编程的基本步骤

  • a、首先配置JTA ,建立相应的数据源
  • b、建立事务:通过创建UserTransaction类的实例来开始一个事务。代码如下:
  Context ctx = new InitialContext(p) ;
   UserTransaction trans = (UserTransaction) ctx.lookup("javax. Transaction.UserTransaction")
  • c、开始事务:代码为 trans.begin() ;
  • d、找出数据源:从 Weblogic Server 上找到数据源,代码如下:
 DataSource ds = (DataSource) ctx.lookup(“mysqldb") ;
  • e、建立数据库连接:
Connection mycon = ds.getConnection() ;
  • f、执行SQL操作:
stmt.executeUpdate(sqlS);
  • g、完成事务:
trans.commit(); / trans.rollback();
  • h、关闭连接:
mycon.close();
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖朋伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值