- 浏览: 147491 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
august_000:
很有道理,我已经亲自测试过了:
public class ...
单例模式之线程安全解析 -
Chris_bing:
一个单例有这么多名堂,最后那个内部类的解决方案很有创意啊,受教 ...
单例模式之线程安全解析
一、什么是Java事务
通常的观念认为,事务仅与数据库相关。
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。
通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。
既然事务的概念从数据库而来,那Java事务是什么?之间有什么联系?
实际上,一个Java应用系统,如果要操作数据库,则通过JDBC来实现的。增加、修改、删除都是通过相应方法间接来实现的,事务的控制也相应转移到Java程序代码中。因此,数据库操作的事务习惯上就称为Java事务。
二、为什么需要事务
事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。具一个简单例子:比如银行转帐业务,账户A要将自己账户上的1000元转到B账户下面,A账户余额首先要减去1000元,然后B账户要增加1000元。假如在中间网络出现了问题,A账户减去1000元已经结束,B因为网络中断而操作失败,那么整个业务失败,必须做出控制,要求A账户转帐业务撤销。这才能保证业务的正确性,完成这个操走就需要事务,将A账户资金减少和B账户资金增加方到一个事务里面,要么全部执行成功,要么操作全部撤销,这样就保持了数据的安全性。
三、Java事务的类型
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事务界定时,您可以将多个SQL语句结合到一个事务中。JDBC事务的一个缺点是事务的范围局限于一个数据库连接。一个JDBC事务不能跨越多个数据库。
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。
四、三种事务差异
1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。
2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。
3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。
五、总结
事务控制是构建J2EE应用不可缺少的一部分,合理选择应用何种事务对整个应用系统来说至关重要。一般说来,在单个JDBC连接连接的情况下可以选择JDBC事务,在跨多个连接或者数据库情况下,需要选择使用JTA事务,如果用到了EJB,则可以考虑使用EJB容器事务。
六、其它事务概念
1)声明式事务
声明式事务(Programmatic transaction management)是Spring提供的对程序事务管理的方式之一。
Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中申明。用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可;在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。
Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为单位,Spring的事务属性自然就在于描述事务应用至方法上的策略,在Spring中事务属性有以下四个参数:
1.传播行为
2.隔离级别
3.只读提示
4.事务超时期间
2)分布式事务
分布式事务处理(Distributed Transaction Processing,DTP)
分布式事务处理是指一个事务可能涉及多个数据库操作,分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)。
3)数据源与连接池
数据源解决的是连接不同类型数据库和修改连接参数的麻烦。
连接池解决的是对数据库连接的管理,合理利用资源,提高性能。
它们处于不同的层次,每个层次都可以不同的方式实现。
更多 : http://www.educity.cn/it/sun/200904071029371466.htm
通常的观念认为,事务仅与数据库相关。
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。
通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。
既然事务的概念从数据库而来,那Java事务是什么?之间有什么联系?
实际上,一个Java应用系统,如果要操作数据库,则通过JDBC来实现的。增加、修改、删除都是通过相应方法间接来实现的,事务的控制也相应转移到Java程序代码中。因此,数据库操作的事务习惯上就称为Java事务。
二、为什么需要事务
事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。具一个简单例子:比如银行转帐业务,账户A要将自己账户上的1000元转到B账户下面,A账户余额首先要减去1000元,然后B账户要增加1000元。假如在中间网络出现了问题,A账户减去1000元已经结束,B因为网络中断而操作失败,那么整个业务失败,必须做出控制,要求A账户转帐业务撤销。这才能保证业务的正确性,完成这个操走就需要事务,将A账户资金减少和B账户资金增加方到一个事务里面,要么全部执行成功,要么操作全部撤销,这样就保持了数据的安全性。
三、Java事务的类型
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事务界定时,您可以将多个SQL语句结合到一个事务中。JDBC事务的一个缺点是事务的范围局限于一个数据库连接。一个JDBC事务不能跨越多个数据库。
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。
四、三种事务差异
1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。
2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。
3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。
五、总结
事务控制是构建J2EE应用不可缺少的一部分,合理选择应用何种事务对整个应用系统来说至关重要。一般说来,在单个JDBC连接连接的情况下可以选择JDBC事务,在跨多个连接或者数据库情况下,需要选择使用JTA事务,如果用到了EJB,则可以考虑使用EJB容器事务。
六、其它事务概念
1)声明式事务
声明式事务(Programmatic transaction management)是Spring提供的对程序事务管理的方式之一。
Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中申明。用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可;在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。
Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为单位,Spring的事务属性自然就在于描述事务应用至方法上的策略,在Spring中事务属性有以下四个参数:
1.传播行为
2.隔离级别
3.只读提示
4.事务超时期间
2)分布式事务
分布式事务处理(Distributed Transaction Processing,DTP)
分布式事务处理是指一个事务可能涉及多个数据库操作,分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)。
3)数据源与连接池
数据源解决的是连接不同类型数据库和修改连接参数的麻烦。
连接池解决的是对数据库连接的管理,合理利用资源,提高性能。
它们处于不同的层次,每个层次都可以不同的方式实现。
更多 : http://www.educity.cn/it/sun/200904071029371466.htm
发表评论
-
(转)Spring声明式事务配置详解
2013-11-11 16:45 1825Spring声明式事务功能应该是大家应用Spring中使用的最 ... -
(转)Java几款性能分析工具的对比
2013-11-01 14:26 1022来源:http://www.javaweb.cc/langua ... -
HashMap的遍历
2013-11-01 14:15 8831、新建一个HashMap Map<Integer , ... -
java将汉子转换成汉语拼音
2013-11-01 13:51 927import net.sourceforge.pinyin4j ... -
Spring加载properties文件的两种方式
2013-10-31 10:05 0在spring中可以通过下面的方式将配置文件中的项注入到配置中 ... -
动态加载spring .xml中的bean对象
2013-10-30 15:27 0在java中如何取得spring.xml中加载的bean对象? ... -
(转)Spring mvc+hibernate+freemarker(实战)
2013-10-28 19:40 988http://zz563143188.iteye.com/bl ... -
(转)Java之美[从菜鸟到高手演变]系列之博文阅读导航
2013-10-28 17:00 1722Java之美[从菜鸟到高手演变]系列之博文阅读导航 http: ... -
(转)openssl 制作证书和签名java方法
2013-10-28 15:03 0Win32OpenSSL_Light-0_9_8k.exe ... -
(转)面向接口编程详解
2013-10-25 12:34 5老文章,自己学习。 面向接口编程详解(一) http://w ... -
(转)Java架构师之路:JAVA程序员必看的15本书
2013-10-08 18:24 0作为Java程序员来说,最 ... -
Java获取CPU ID和磁盘ID
2013-09-25 20:18 0原文链接:http://www.rgagnon.com/jav ... -
Java编程之备用程序段
2013-09-25 14:57 0记录一些程序段,供日常备用,持续增加中…… 1. Java中 ... -
(转)Java编程之AOP
2013-09-25 14:45 0链接: http://hw19886200.iteye.com ... -
Java编程之性能优化
2013-09-25 14:28 758最近的机器内存又爆满 ... -
使用axis2传输附件
2013-09-25 10:40 1047服务端Service文件: import java.io. ... -
Java应用程序项目打包成exe文件
2013-09-23 09:16 01.程序打包 首先将程序打成Jar包,打包命 ... -
JAVA文件_加密
2013-09-13 16:09 0import java.awt.*; import java ... -
(转)Java 实现Rsa 加密
2013-09-13 16:08 0import java.io.*; public class ... -
(转)Java程序生成注册码
2013-09-13 16:08 0import java.io.*; import java.t ...
相关推荐
Java基础:Java事务处理类型-差异总结.htm
在Java中,类型转换分为自动类型转换和强制类型转换两种。自动类型转换发生在数据范围较小的数据类型赋值给数据范围较大的数据类型时,而强制类型转换则需要程序员显式地使用 `(type)` 进行转换,但可能因数据丢失或...
"java精通+开发案例 经典经典总结"这个主题涵盖了Java学习的核心内容和实战经验,旨在帮助开发者深化对Java的理解并提升开发技能。 一、Java基础 1. 类与对象:Java是面向对象的语言,理解类和对象的概念是基础。类...
Spring是Java企业级应用程序中最广泛使用的开源框架之一,它提供了诸如依赖注入、AOP(面向切面编程)、事务管理、数据访问等多种功能。 首先,书中详细介绍了Spring的依赖注入(DI)机制,这是Spring的核心特性。DI...
【华为Java面试题总结】 在Java开发者的眼中,华为无疑是中国IT行业的巨头,其面试流程严谨,技术要求高。这份“华为Java面试题总结”旨在为准备进入华为的Java工程师提供一些关键知识点的梳理和复习指导。以下是对...
6. **事务管理**:Oracle和SQL Server在事务处理上的API可能会有所不同,需要确保Java代码中的事务控制逻辑适应新的数据库环境。 7. **连接池配置**:在Java应用中,通常会使用连接池来管理数据库连接。需要更新...
- **事务处理**:了解ACID属性,实现事务的提交、回滚和隔离级别设置。 - **结果集处理**:ResultSet的操作,遍历查询结果。 7. **Java高级特性**: - **Lambda表达式**:简化函数式接口的使用,实现匿名内部类...
理解它们的差异、性能特点及应用场景至关重要。此外,集合接口如Iterable、ListIterator等也是需要掌握的关键点。 三、JVM Java虚拟机(JVM)是Java程序运行的基石,负责字节码的解析和执行。深入理解JVM内存模型...
它是默认的存储引擎,适合处理大量数据并需要事务安全的应用场景。InnoDB使用自适应哈希索引、MVCC(多版本并发控制)来提高并发性能,并实现了redo log和undo log来确保事务的原子性和持久性。 5. Java重载的几种...
- **Java9改进**:比较Java9与Java8的主要差异,重点介绍新特性及优化点。 - **HashMap内部结构**:详解HashMap的数据结构及其实现原理。 - **反射机制**:说明反射的用途及其实现方式,探讨其性能影响及应用场合。 ...
Oracle是知名的高性能关系型数据库,而SQL Server则是Microsoft公司推出的强大数据库解决方案,两者在语法、数据类型以及管理方式上都有所差异。 在Java中实现这样的转换,主要涉及到以下几个关键知识点: 1. **...
JDBC(Java Database Connectivity)是Java平台中用于与各种数据库交互的一组接口和类,它使得开发者能够用纯Java代码来访问和操作数据库,从而避免了不同数据库之间的语法差异。JDBC API包含两个主要的包:`java....
- 使用Java 8及更高版本引入的Lambda表达式和Stream API可以帮助实现这些功能。 3. **惰性求值的实现**: - Haskell中的惰性求值机制很难直接在Java中实现。 - 可以通过延迟执行的策略或者使用Stream API来模拟...
这份"java笔试、面试宝典(总结)"包含了丰富的资源,包括中兴、华为等知名企业的面试题目,以及相关的学习总结和答案,对毕业生或寻求提升技术能力的开发者来说是一份宝贵的参考资料。 1. **基础语法** - 类与...
JAVA代码应包含适当的异常处理机制,并考虑使用事务来确保数据的一致性。如果在导入过程中发生错误,可以回滚事务,避免部分导入的数据导致数据不一致。 7. **性能优化**: 为了加快数据迁移速度,可以考虑使用...
本资料“最新JAVA面试题总结之数据库”聚焦于Java与数据库相关的面试知识点,旨在帮助求职者更好地准备数据库相关的面试问题。下面我们将深入探讨其中涉及的一些重要概念和技术。 1. **JDBC(Java Database ...
在Java编程中,处理事务主要涉及JDBC(Java Database Connectivity)和JTA(Java Transaction API)。理解这些概念对于开发可靠的、高性能的数据库应用至关重要。 首先,让我们从事务的四大特性说起: 1. **原子性...