事务处理

Java中使用事务处理,首先要求数据库支持事务。如使用MySQL的事务功能,就要求MySQL的表类型为Innodb。

Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。

  1、JDBC事务

  JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口(
java.sql.Connection )提供了两种事务模式:自动提交和手工提交。 java.sql.Connection
提供了以下控制事务的方法:

  public void setAutoCommit(boolean)

  public boolean getAutoCommit()

  public void commit()

  public void rollback()

在jdbc
api中,默认的情况为自动提交事务,也就是说,每一条对数据库的更新的sql语句代表一项事务,操作成功后,系统自动调用commit()来提交,否则将调用rollback()来撤消事务。

  使用 JDBC 事务界定时,您可以将多个 SQL 语句结合到一个事务中。JDBC
事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。

public int delete(int sID) {
 dbc = new DataBaseConnection();
 Connection con = dbc.getConnection();
 try {
  con.setAutoCommit(false);// 更改JDBC事务的默认提交方式
  dbc.executeUpdate("delete from bylaw where ID=" + sID);
  dbc.executeUpdate("delete from bylaw _content where ID=" +
sID);
  dbc.executeUpdate("delete from bylaw _affix where bylawid=" +
sID);
  con.commit();//提交JDBC事务
  con.setAutoCommit(true);// 恢复JDBC事务的默认提交方式
  dbc.close();
  return 1;
 }
 catch (Exception exc) {
  con.rollBack();//回滚JDBC事务
  exc.printStackTrace();
  dbc.close();
  return -1;
 }
}
  2、JTA(Java Transaction API)事务

  JTA是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用JTA来访问事务。

  JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据,这些数据可以分布在多个数据库上。JDBC驱动程序的JTA支持极大地增强了数据访问能力。

  如果计划用 JTA 界定事务,那么就需要有一个实现 javax.sql.XADataSource 、
javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC
驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection
对象的工厂。 XAConnection s 是参与 JTA 事务的 JDBC 连接。

  您将需要用应用服务器的管理工具设置 XADataSource .从应用服务器和 JDBC
驱动程序的文档中可以了解到相关的指导。

  J2EE应用程序用 JNDI 查询数据源。一旦应用程序找到了数据源对象,它就调用
javax.sql.DataSource.getConnection()
以获得到数据库的连接。

XA 连接与非 XA 连接不同。一定要记住 XA 连接参与了 JTA
事务。这意味着 XA 连接不支持 JDBC 的自动提交功能。同时,应用程序一定不要对 XA 连接调用
java.sql.Connection.commit() 或者 java.sql.Connection.rollback()
.

  相反,应用程序应该使用 UserTransaction.begin()、 UserTransaction.commit() 和
serTransaction.rollback() .

  3、容器事务

  容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现。相对编码实现JTA
事务管理,我们可以通过EJB容器提供的容器事务管理机制(CMT)完成同一个功能,这项功能由J2EE应用服务器提供。这使得我们可以简单的指定将哪个
方法加入事务,一旦指定,容器将负责事务管理任务。这是我们土建的解决方式,因为通过这种方式我们可以将事务代码排除在逻辑编码之外,同时将所有困难交给
J2EE容器去解决。使用EJB CMT的另外一个好处就是程序员无需关心JTA
API的编码,不过,理论上我们必须使用EJB.

三种Java事务差异

  1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。

  2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。

  3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。

时间: 2024-08-25 07:29:52

事务处理的相关文章

数据库的事务处理---PDO实现

事务处理用一句简单的术语称为"原子操作",即一件事情,要么全部完成,要么一个也别完成:有一种一荣俱荣,一损俱损的感觉. 最常用的就是在交易过程中,比如在网络中,甲方付费给乙方,钱确认付款,但是乙方并未确认收款,那么,甲方的账户并不会减少,乙方的账户也并不会增加. 只有当甲方确认付款,乙方确认收款,两个步骤都完成,并且不出现错误的时候,双方的账户才会改变 看代码也许更好理解 1 <?php 2 try{ 3 $pdo=new PDO("mysql:host=localho

mysql 事务处理

知识点: 事务处理是什么? 当数据库表呈树状机构设计时,我们对一个表进行增.删.改的操作,可能会要求对另外的表进行相同的操作,为了保证这多个sql能同时执行成功,就要使用mysql的事务处理. 注意:只有增删改的操作可以进行回滚,alter等操作不可行! 事务特性: 1.原子性:所有的sql执行操作必须全部成功,否则则回滚到处理前状态 2.一致性: 确保数据库正确地改变状态后,成功提交的事务. 3.隔离性: 使事务操作彼此独立的和透明的. 4.持久性: 确保提交的事务的结果或效果的系统出现故障的

第一次接触终极事务处理——Hekaton

在这篇文章里,我想给出如何与终极事务处理(Extreme Transaction Processing (XTP) )的第一步接触,即大家熟知的Hakaton.如果你想对XTP有个很好的概况认识,我推荐Kalen Delaney写的关于它的白皮书,另外微软研究院也发布了题为“对于内存数据库的高性能并发控制机制(High-Performance Concurrency Control Mechanisms for Main-Memory Databases)”的研究白皮书,点此下载. 所有XTP维

JDBC的进化3--补充:事务处理

接着JDBC的进化3,我们来说数据库事务. 事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态. 怎么理解呢? 一组逻辑单元:我认为指的是多条的DML操作,只是一条DML语句的话,对于mysql来说,执行完成功就自动提交了,没成功的话,就没成功喽,这样说来,一条DML语句就相当于一个原子,不可再分了. 从一种状态变换到另一种状态:即这组操作是成功了还是失败了,他们必须同时都成功,有一个失败,就退回到起点.例如银行的转账,不能一个成功,一个失败吧. 来看看JDBC的事务处理: 先来看看,在什

Redis缓存技术学习系列之事务处理

?在本系列的第一篇文章中,我们主要针对Redis中的"键"和"值"进行了学习.我们可以注意到,Redis是一个C/S架构的数据库,在我们目前的认知中,它是通过终端中的一条条命令来存储和读取的,即它是一个非常典型的"请求-响应"模型.可是我们知道在实际的应用中,我们要面对的或许是更为复杂的业务逻辑,因为Redis中不存在传统关系型数据库中表的概念,因此在使用Redis的过程中,我们要面对两个实际的问题,即如何更好的维护数据库中的"键&qu

分布式系统的事务处理【转】

转:http://coolshell.cn/articles/10910.html 当我们在生产线上用一台服务器来提供数据服务的时候,我会遇到如下的两个问题: 1)一台服务器的性能不足以提供足够的能力服务于所有的网络请求. 2)我们总是害怕我们的这台服务器停机,造成服务不可用或是数据丢失. 于是我们不得不对我们的服务器进行扩展,加入更多的机器来分担性能上的问题,以及来解决单点故障问题. 通常,我们会通过两种手段来扩展我们的数据服务: 1)数据分区:就是把数据分块放在不同的服务器上(如:uid %

PHP MYSQLI中事务处理

MYSQL事务处理让所有sql语句执行成功后才去处理,如果有一条没有成功或者报错就会回滚事务,防止敏感操作处理失败.MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其它类型是不支持的! $mysqli->autocommit(FALSE); //关闭自动提交功能 $sql = "UPDATE users SET money = money-300 WHERE username = 'Mike'"; $res1 = $mysqli->query($sql);

数据库事务处理机制之事务回滚问题讨论

一.Sql中的事务 概念:事物是一种机制,是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.事务是一个不可分割的工作逻辑单元.在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的.多用户登录系统适于使用事务机制. 属性:4大属性: a.原子性:事务时一个完整的操作.b.一致性:当事务完成时,数据库必须处于一致状态.c.隔离性:对数据进行修改的所有并发事务时彼此隔离的.d.持久性:事务完成后,它对于系统的影响是永久性的. 创建 (1)开始事务:begin t

JDBC编程之事务处理

JDBC中的事务处理指的是事务的一致性等问题,例如插入一条数据(id,name,password)到表中,另一条数据(address,id)到另一张表中,并且两条数据是相关联的,那么假设第一条数据插入成功,但是第二条数据由于异常没有插入成功,那么此时为了保证事务的一致性.完整性,则两条数据都不能够插入. 1. 创建Conn连接类 Conn.java 1 package com.test.conn; 2 3 import java.sql.Connection; 4 import java.sql

oracle学习篇六:更新操作、事务处理

----------------1.数据库更新操作----------------------------- select * from tab;--查询表 drop table siebel_user;--删除表 --copy一份表结构create table myemp as select * from emp; select * from myemp; --插入记录insert into myemp(empno,ename,job,hiredate,sal,comm,deptno) val