您当前的位置:首页 > 互联网教程

在java中,“事务”选项有什么用

发布时间:2025-05-23 18:34:21    发布人:远客网络

在java中,“事务”选项有什么用

一、在java中,“事务”选项有什么用

一、什么是Java事务 \x0d\x0a通常的观念认为,事务仅与数据库相关。 \x0d\x0a事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 \x0d\x0a(isolation)和持久性(durability)的缩写。事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示\x0d\x0a \x0d\x0a当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。持\x0d\x0a久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。 \x0d\x0a通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。 \x0d\x0a既然事务的概念从数据库而来,那Java事务是什么?之间有什么联系? \x0d\x0a实际上,一个Java应用系统,如果要操作数据库,则通过JDBC来实现的。增加、修改、删除都是通过相应方法间接来实现的,事务的控制也相应转移到Java程序代码中。因此,数据库操作的事务习惯上就称为Java事务。 \x0d\x0a二、为什么需要事务 \x0d\x0a事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。具一个简单例子:比如银行转帐业务,账户A要将自己账户上的1000元 \x0d\x0a转到B账户下面,A账户余额首先要减去1000元,然后B账户要增加1000元。假如在中间网络出现了问题,A账户减去1000元已经结束,B因为网络中\x0d\x0a \x0d\x0a断而操作失败,那么整个业务失败,必须做出控制,要求A账户转帐业务撤销。这才能保证业务的正确性,完成这个操走就需要事务,将A账户资金减少和B账户资\x0d\x0a金增加方到一个事务里面,要么全部执行成功,要么操作全部撤销,这样就保持了数据的安全性。 \x0d\x0a三、Java事务的类型 \x0d\x0a Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。 \x0d\x0a 1、JDBC事务 \x0d\x0a JDBC事务是用 Connection对象控制的。JDBC Connection接口( java.sql.Connection)提供了两种事务模式:自动提交和手工提交。 java.sql.Connection提供了以下控制事务的方法: \x0d\x0a public void setAutoCommit(boolean) \x0d\x0a public boolean getAutoCommit() \x0d\x0a public void commit() \x0d\x0a public void rollback() \x0d\x0a使用 JDBC事务界定时,您可以将多个 SQL语句结合到一个事务中。JDBC事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC事务不能跨越多个数据库。 \x0d\x0a 2、JTA(Java Transaction API)事务 \x0d\x0a JTA是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用JTA来访问事务。 \x0d\x0a JTA允许应用程序执行分布式事务处理_在两个或多个网络计算机资源上访问并且更新数据,这些数据可以分布在多个数据库上。JDBC驱动程序的JTA支持极大地增强了数据访问能力。 \x0d\x0a如果计划用 JTA界定事务,那么就需要有一个实现 javax.sql.XADataSource、 \x0d\x0ajavax.sql.XAConnection和 javax.sql.XAResource接口的 JDBC \x0d\x0a驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA事务。一个 XADataSource对象就是一个 XAConnection \x0d\x0a对象的工厂。 XAConnection s是参与 JTA事务的 JDBC连接。 \x0d\x0a您将需要用应用服务器的管理工具设置 XADataSource。从应用服务器和 JDBC驱动程序的文档中可以了解到相关的指导。 \x0d\x0a J2EE应用程序用 JNDI查询数据源。一旦应用程序找到了数据源对象,它就调用 javax.sql.DataSource.getConnection()以获得到数据库的连接。 \x0d\x0a XA连接与非 XA连接不同。一定要记住 XA连接参与了 JTA事务。这意味着 XA连接不支持 JDBC \x0d\x0a的自动提交功能。同时,应用程序一定不要对 XA连接调用 java.sql.Connection.commit()或者 \x0d\x0ajava.sql.Connection.rollback()。相反,应用程序应该使用 UserTransaction.begin()、 \x0d\x0aUserTransaction.commit()和 serTransaction.rollback()。 \x0d\x0a 3、容器事务 \x0d\x0a容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现。相对编码实现JTA事 \x0d\x0a务管理,我们可以通过EJB容器提供的容器事务管理机制(CMT)完成同一个功能,这项功能由J2EE应用服务器提供。这使得我们可以简单的指定将哪个方\x0d\x0a法加入事务,一旦指定,容器将负责事务管理任务。这是我们土建的解决方式,因为通过这种方式我们可以将事务代码排除在逻辑编码之外,同时将所有困难交给\x0d\x0a J2EE容器去解决。使用EJB CMT的另外一个好处就是程序员无需关心JTA API的编码,不过,理论上我们必须使用EJB。 \x0d\x0a四、三种事务差异 \x0d\x0a 1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。 \x0d\x0a 2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。 \x0d\x0a 3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。 \x0d\x0a五、总结 \x0d\x0a事务控制是构建J2EE应用不可缺少的一部分,合理选择应用何种事务对整个应用系统来说至关重要。一般说来,在单个JDBC \x0d\x0a连接连接的情况下可以选择JDBC事务,在跨多个连接或者数据库情况下,需要选择使用JTA事务,如果用到了EJB,则可以考虑使用EJB容器事务。\x0d\x0a\x0d\x0a如果满意请及时采纳,谢谢~

二、java具体是什么意思

Java简介 Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动感的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet。另一方面,Java技术也不断更新。 Java平台由Java虚拟机(Java Virtual Machine)和Java应用编程接口(Application Programming Interface、简称API)构成。Java应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。Java应用编程接口已经从1.1.x版发展到1.2版。目前常用的Java平台基于Java1.4,最近版本为Java1.6。 Java分为三个体系JavaSE,JavaEE,JavaME。 Java语言 Java语言是一个支持网络计算的面向对象程序设计语言。Java语言吸收了Smalltalk语言和C++语言的优点,并增加了其它特性,如支持并发程序设计、网络通信、和多媒体数据控制等。主要特性如下: 1) Java语言是简单的。Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧。 2) Java语言是一个面向对象的。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。 3) Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java.net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、 ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 4) Java语言是健壮的。Java的强类型机制、异常处理、废料的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。 5) Java语言是安全的。Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。 6) Java语言是体系结构中立的。Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。 7) Java语言是可移植的。这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。 8) Java语言是解释型的。如前所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。 9) Java是高性能的。与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。 10) Java语言是多线程的。在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable)的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。 Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。 11) Java语言是动态的。Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。 Java语言的优良特性使得Java应用具有无比的健壮性和可靠性,这也减少了应用系统的维护费用。Java对对象技术的全面支持和Java平台内嵌的API能缩短应用系统的开发时间并降低成本。Java的编译一次,到处可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。特别是Java企业应用编程接口(Java Enterprise APIs)为企业计算及电子商务应用系统提供了有关技术和丰富的类库。 1) JDBC(Java Database Connectivity)提供连接各种关系数据库的统一接口。 2) EJB(Enterprise JavaBeans)使得开发者方便地创建、部署和管理跨平台的基于组件的企业应用。 3) Java RMI(Java Remote Method Invocation)用来开发分布式Java应用程序。一个Java对象的方法能被远程Java虚拟机调用。这样,远程方法激活可以发生在对等的两端,也可以发生在客户端和服务器之间,只要双方的应用程序都是用Java写的。 4) Java IDL(Java Interface Definition Language)提供与CORBA(Common Object Request Broker Architecture)的无逢的互操作性。这使得Java能集成异构的商务信息资源。 5) JNDI(Java Naming and Directory Interface)提供从Java平台到的统一的无逢的连接。这个接口屏蔽了企业网络所使用的各种命名和目录服务。 6) JMAPI(Java Management API)为异构网络上系统、网络和服务管理的开发提供一整套丰富的对象和方法。 7) JMS(Java Message Service)提供企业消息服务,如可靠的消息队列、发布和订阅通信、以及有关推拉(Push/Pull)技术的各个方面。 8) JTS(Java transaction Service)提供存取事务处理资源的开放标准,这些事务处理资源包括事务处理应用程序、事务处理管理及监控。在Java技术中,值得关注的还有JavaBeans,它是一个开放的标准的组件体系结构,它独立于平台,但使用Java语言。一个JavaBean是一个满足JavaBeans规范的Java类,通常定义了一个现实世界的事物或概念。一个JavaBean的主要特征包括属性、方法和事件。通常,在一个支持JavaBeans规范的开发环境(如Sun Java Studio和IBM VisualAge for Java)中,可以可视地操作JavaBean,也可以使用JavaBean构造出新的JavaBean。JavaBean的优势还在于Java带来的可移植性。现在,EJB(Enterprise JavaBeans)将JavaBean概念扩展到Java服务端组件体系结构,这个模型支持多层的分布式对象应用。除了JavaBeans,典型的组件体系结构还有DCOM和CORBA,关于这些组件体系结构的深入讨论超出了本书的范围。

三、java事务相关

一般情况下,J2EE应用服务器支持JDBC事务、JTA(JavaTransactionAPI)事务、容器管理事务。一般情况下,最好不要在程序中同时使用上述三种事务类型,比如在JTA事务中嵌套JDBC事务。第二方面,事务要在尽可能短的时间内完成,不要在不同方法中实现事务的使用。下面我们列举两种事务处理方式。

1、JavaBean中使用JDBC方式进行事务处理

在JDBC中怎样将多个SQL语句组合成一个事务呢?在JDBC中,打开一个连接对象Connection时,缺省是auto-commit模式,每个SQL语句都被当作一个事务,即每次执行一个语句,都会自动的得到事务确认。为了能将多个SQL语句组合成一个事务,要将auto-commit模式屏蔽掉。在auto-commit模式屏蔽掉之后,如果不调用commit()方法,SQL语句不会得到事务确认。在最近一次commit()方法调用之后的所有SQL会在方法commit()调用时得到确认。

Connectioncon=dbc.getConnection();

con.setAutoCommit(false);//更改JDBC事务的默认提交方式

dbc.executeUpdate("deletefrombylawwhereID="+sID);

dbc.executeUpdate("deletefrombylaw_contentwhereID="+sID);

dbc.executeUpdate("deletefrombylaw_affixwherebylawid="+sID);

con.setAutoCommit(true);//恢复JDBC事务的默认提交方式

JTA是事务服务的J2EE解决方案。本质上,它是描述事务接口(比如UserTransaction接口,开发人员直接使用该接口或者通过J2EE容器使用该接口来确保业务逻辑能够可靠地运行)的J2EE模型的一部分。JTA具有的三个主要的接口分别是UserTransaction接口、TransactionManager接口和Transaction接口。这些接口共享公共的事务操作,例如commit()和rollback(),但是也包含特殊的事务操作,例如suspend(),resume()和enlist(),它们只出现在特定的接口上,以便在实现中允许一定程度的访问控制。例如,UserTransaction能够执行事务划分和基本的事务操作,而TransactionManager能够执行上下文管理。

应用程序可以调用UserTransaction.begin()方法开始一个事务,该事务与应用程序正在其中运行的当前线程相关联。底层的事务管理器实际处理线程与事务之间的关联。UserTransaction.commit()方法终止与当前线程关联的事务。UserTransaction.rollback()方法将放弃与当前线程关联的当前事务。

UserTransactiontransaction=sessionContext.getUserTransaction();//获得JTA事务

transaction.begin();//开始JTA事务

dbc.executeUpdate("deletefrombylawwhereID="+sID);

dbc.executeUpdate("deletefrombylaw_contentwhereID="+sID);

dbc.executeUpdate("deletefrombylaw_affixwherebylawid="+sID);

transaction.commit();//提交JTA事务

transaction.rollback();//JTA事务回滚