Java数据库事务的四大特性里,事务的ACID是指什么?

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
【JAVA事务】JAVA的事务处理总结
摘要:一:什么是JAVA事务?&&&通常的观念认为,事务仅与数据库相关.事务必须服从ISO/IEC所指定的ACID原则.ACID是原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持久性(Durabillty)的缩写.事物的原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效.一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行之前的状态.隔离性:表示在事务执行过程中对数据的
一:什么是JAVA事务?
&&& 通常的观念认为,事务仅与数据库相关.
事务必须服从ISO/IEC所指定的ACID原则.ACID是原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持久性(Durabillty)的缩写.
事物的原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效.
一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行之前的状态.
隔离性:表示在事务执行过程中对数据的修改,在事务没有提交之前对其他事务是不可见的
持久性:表示已经提交的数据在事务执行失败时,数据的状态都应该正确.
通俗的理解:事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行错误,则撤销先前执行过的所有命令.更简单的说,就是要么全部执行成功,要么全部撤销不执行.
既然事务的概念是从数据库而来,那么JAVA的事务是什么?之间有什么联系呢?
实际上,一个JAVA应用系统,如果要操作数据库,则通过JDBC来实现,增加,删除,修改都是通过相应方法间接来实现的,事务控制也相应专一到了JAVA的程序代码上,所以说,数据库操作的事务也习惯上就成为JAVA事务了.
二:为什么需要事务?
&&& 事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问.举一个简单的例子,比如银行转账业务,账户A要将自己账户上的1000元转到B账户下面,A账户余额首先要减去1000,然后B账户要增加1000,加入在中间网络出现了问题,A账户减去1000元已经结束,B因为网络中断而操作失败,那么整个业务失败.如果没有事务,那么客户将损失1000块,所以必须做出控制,要求A账户转账业务撤销.这才能保证业务的正确性,完成这个操作就需要事务来控制.将A账户资金减少和B账户资金增加放到一个事物里面,要么全部成功,要么撤销全部操作.这样,就保证了数据的安全性.
三:JAVA事务的类型
&&& JAVA的事务类型有三种.JDBC事务.JTA(JAVA Transaction Api)事务,容器事务
1.jdbc事务:是Connection对象控制的.JDBC Connection接口提供了两种事务模式:自动提交和手动提交,JAVA.SQL.Conection提供了以下控制事务的方法
public void setAutoConmmit(boolean)
public boolean getAutoCommit()
public void commit();
public void roolback();
使用JDBC事务界定时,你可以将多个SQL语句结合到一个事物当中.JDBC事务的一个缺点就是事务的范围局限于一个数据库连接.
&&& JTA是一种高层的,与实现无关的.与协议无关的api,应用程序和应用服务器可以使用JTA来访问事务.
JTA允许应用程序执行分布式事务处理,在两个或多个网络计算机资源上访问并且更新数据,这些数据可以分布在多个数据库上.JDBC驱动程序的JTA支持极大地增强了数据访问能力
如果计划用JTA界定事务,那么就需要一个实现.JAVAX.sql.XADataSjavax.sql.XAResource接口的JDBC驱动程序.一个实现了这些接口的驱动程序将可以参与JTA事务.一个XADataSource对象就是一个XAConnection对象的工厂.XAConnections是参与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实现.相对编码实现事务管理,我们可以通过EJB容易提供的容器事务管理机制CMT完成同一个功能.这项功能由J2EE应用服务器提供.
四:三种事务差异
1.JDBC事务控制的局限性在一个数据库连接内,但是使用简单.
2,JTA事务的功能强大,事务可以跨越多个数据库或者多个DAO.使用也比较复杂.
3.容器事务,主要指的是J2EE应用服务器提供的事务管理.局限于EJB的应用使用
&&& 事务控制是构建J2EE应用不可缺少的一部分.合理选择应用何种事务对整个应用系统来说至关重要,一般来说,在单个JDBC链接的情况下可以选择JDBC事务,在跨多个链接或者数据库的情况下,需要选择使用JTA事务,如果用到了EJB则可以考虑使用EJB容器的事务
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
【JAVA事务】JAVA的事务处理总结相关信息,包括
的信息,所有【JAVA事务】JAVA的事务处理总结相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
InternationalJava新晋程序猿,你真的明白数据库事务隔离级别吗?Java新晋程序猿,你真的明白数据库事务隔离级别吗?霸道科技百家号学习数据库的时候常常会接触到事务, ACID等概念,那么到底什么是数据库的事务,数据库事务又具有哪些特点,和ACID有怎样的关系,事务的隔离级别又是做什么的呢?注:本文参考自>一书事务事务是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元,狭义上的事务特指数据库事务。举个例子来说,张三给李四转了1000元钱,那么在数据库操作时,就要先把张三的账户减去1000元,再把李四的账户加上1000元,两部分操作放在一起,才是一个完整的转账过程,也可称之为事务。ACID事务具有一定的特点,也就是我们常常所说的ACID。事务的四个特性如下:原子性(Atomicity)。事务包含的一系列操作要么全部成功,要么全部失败。一旦有一个操作失败,则将已经执行过的操作进行回滚撤销。上述例子中,张三账户减去1000元,李四账户增加1000元两部分操作必须同时成功或失败,不能够出现张三减去了1000,但是李四并没有增加1000的情况。一致性(Consistency)。这里的一致性指的是事务执行前后,数据库都处于一致性状态。上述的例子中,无论怎么增加和减少,张三和李四两个人账户里的钱,加起来总数是不会发生改变的。持久性(Durability)。一个事务一旦成功提交,那么它对数据库做出的改变是永久的。隔离性(Isolation)。指并发环境中,事务之间是相互隔离,不可打扰的。原子性和一致性,上述都已经进行了解释。持久性,顾名思义,对数据库的改变是永久的。最后一个隔离性比较复杂,因为对事务之间进行隔离,隔离到什么程度比较合适呢?完全隔离的话,影响执行性能,完全不隔离的话,容易造成数据的不一致。要解决这些问题,我们先来了解几个基本概念。脏读,不可重复读,幻读脏读:一个事务读取了另一个事务还未提交的数据。事务A和事务B同时执行,事务A在整个执行阶段,将某个数据项的值由1加到10,然后进行事务提交。在此过程中。事务B进行一次读取,可能看到(1,2,3,4,5,6,7,8,9,10)中的任意值。不可重复读:指在一个事务内读取表中的某一行数据,多次读取结果不同。如果不考虑脏读的情况,假设事务A,事务B,事务C同时执行,事务A在整个执行阶段,将某个数据项的值由1加到10,然后进行事务提交。在此过程中,事务B进行读取,只可能读取到1和最终值10。之后事务B并没有结束,事务C再次将该项的值由10加到20,然后进行事务提交。在此过程中,事务B再次进行读取,只可能读取到10和最终值20。因此事务B在执行过程中有可能两次读取结果不同。幻读:指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。如果不考虑脏读和不可重复读的情况,假设事务A对一个表中的某个数据项设置为1,这种修改涉及到表中的全部数据行,与此同时,事务B向表中插入一条新的数据且该数据项为2,那么此时操作事务A的用户就会发现表中有一条数据的该数据项居然不是1,好像发生了幻觉。在上述的例子上,不可重复读和幻读的区别就在于:不可重复读:在同一事务中,两次读取同一数据,得到内容不同幻读:同一事务中,用同样的操作读取两次,得到的记录数不相同为了解决以上这些问题,保证事务与事务之间的隔离性,数据库中对事 务的隔离级 别做出了限制,分别在一定程度上对以上问题进行了解决。事务隔离级别在标准SQL规范中,定义了四个事务隔离级别。读未提交。最低级别,以上问题均无法解决。读已提交。可避免脏读情况发生。可重复读取。可避免脏读、不可重复读情况的发生。保证在事务的处理过程中,多次读取同一个数据的时候,其值都和事务开始的时候是一致的。这也是为何下图中只能读取到1的原因。串行化。最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行,可避免脏读、不可重复读、幻读情况的发生。下图中是一个很好的例子,分别解释了四种事务隔离级别下,事务B能够读取到的结果。总的来说,事务隔离级别越高,越能保证数据的完整性和一致性,但是付出的代价却是并发的性能。最后,大家点个赞再走呗~本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。霸道科技百家号最近更新:简介:分享好听的音乐,传播正能量。作者最新文章相关文章思考、总结是进步的捷径
数据库的事物ACID是指什么
ACID分别是Atomic(原子性),Consistency(一致性),Isolation(隔离性),Durability(持久性)的英文缩写原子性:只有数据库的所有操作,全部执行成功,才算整个事务的成功;任何一个SQL语句错误,那么执行的所有SQL必须撤销一致性:数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性隔离性:指的是在并发环境中,当不同的事务同时操作相同的数据,每个事务都有自己的完整数据空间持久性:只要事务成功结束,他对数据库的操作更新就永久的保存下来。(发生生系统崩溃,重启数据库后,数据库能回复到事务成功后的状态)
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!博客分类:
我们都知道事务的概念,那么事务的传播特性是什么呢?(此处着重介绍传播特性的概念,关于传播特性的相关配置就不介绍了,可以查看spring的官方文档) 在我们用SSH开发项目的时候,我们一般都是将事务设置在Service层 那么当我们调用Service层的一个方法的时候它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,在事务层里面调用的这些方 法要么全部成功,要么全部失败。那么事务的传播特性也是从这里说起的。 如果你在你的Service层的这个方法中,除了调用了Dao层的方法之外,还调用了本类的其他的Service方法,那么在调用其他的 Service方法的时候,这个事务是怎么规定的呢,我必须保证我在我方法里掉用的这个方法与我本身的方法处在同一个事务中,否则如果保证事物的一致性。 事务的传播特性就是解决这个问题的,“事务是会传播的”在Spring中有针对传播特性的多种配置我们大多数情况下只用其中的一 种:PROPGATION_REQUIRED:这个配置项的意思是说当我调用service层的方法的时候开启一个事务(具体调用那一层的方法开始创建事 务,要看你的aop的配置),那么在调用这个service层里面的其他的方法的时候,如果当前方法产生了事务就用当前方法产生的事务,否则就创建一个新 的事务。这个工作使由Spring来帮助我们完成的。 以前没有Spring帮助我们完成事务的时候我们必须自己手动的控制事务,例如当我们项目中仅仅使用hibernate,而没有集成进 spring的时候,我们在一个service层中调用其他的业务逻辑方法,为了保证事物必须也要把当前的hibernate session传递到下一个方法中,或者采用ThreadLocal的方法,将session传递给下一个方法,其实都是一个目的。现在这个工作由 spring来帮助我们完成,就可以让我们更加的专注于我们的业务逻辑。而不用去关心事务的问题。 默认情况下当发生RuntimeException的情况下,事务才会回滚,所以要注意一下 如果你在程序发生错误的情况下,有自己的异常处理机制定义自己的Exception,必须从RuntimeException类继承 这样事务才会回滚!
Spring事务传播特性总结:1.只要定义为spring的bean就可以对里面的方法使用@Transactional注解。 2.Spring的事务传播是Spring特有的。不是对底层jdbc的代理。3.使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在[方法调用之前决定是否开启一个事务],并在[方法执行之后]决定事务提交或回滚事务。 4.Spring支持的PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别:PROPAGATION_REQUIRES_NEW:二个事务没有信赖关系,不会存在A事务的成功取决于B事务的情况。有可能存在A提交B失败。A失败(比如执行到doSomeThingB的时候抛出异常)B提交,AB都提交,AB都失败的可能。PROPAGATION_NESTED:与PROPAGATION_REQUIRES_NEW不同的是,内嵌事务B会信赖A。即存在A失败B失败。A成功,B失败。A成功,B成功。而不存在A失败,B成功。5. 特别注意PROPAGATION_NESTED的使用条件:使用JDBC 3.0驱动时,仅仅支持DataSourceTransactionManager作为事务管理器。需要JDBC 驱动的java.sql.Savepoint类。有一些JTA的事务管理器实现可能也提供了同样的功能。使用PROPAGATION_NESTED,还需 要把PlatformTransactionManager的nestedTransactionAllowed属性设为而 nestedTransactionAllowed属性值默认为 6.特别注意PROPAGATION_REQUIRES_NEW的使用条件:JtaTransactionManager作为事务管理器
的AOP简介与事务传播特性总结 16:56srping用到的另外一项技术就是AOP(Aspect-Oriented Programming, 面向切面编程),它是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程)的补充。AOP 的主要编程对象是切面(aspect), 而切面模块化横切关注点。在应用 AOP 编程时, 仍然需要在定义公共功能, 但可以明确的定义这个功能在哪里, 以什么方式应用, 并且不必修改受影响的类. 这样一来横切关注点就被模块化到特殊的对象(切面)里。每个事物逻辑位于一个位置, 代码不分散,便于维护和升级,业务模块更简洁, 只包含核心业务代码。现实中使用spring最多的就是声明式事务配置功能。下面就来了解其aop在事务上应用。首先要了解的就是AOP中的一些概念: Aspect(切面):指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象。 joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器)。 Pointcut(切入点):所谓切入点是指我们要对那些joinpoint进行拦截的定义。 Advice(通知):所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知。 Target(目标对象):代理的目标对象。 Weave(织入):指将aspects应用到target对象并导致proxy对象创建的过程称为织入。 Introduction(引入):在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或Field。 所谓AOP,我的理解就是应该是这样一个过程,首先需要定义一个切面,这个切面是一个类,里面的方法就是关注点(也是通知),或者说里面的方法就 是用来在执行目标对象方法时需要执行的前置通知,后置通知,异常通知,最终通知,环绕通知等等。有了切面和通知,要应用到目标对象,就需要定义这些通知的 切入点,换句话说就是需要对哪些方法进行拦截,而这些被拦截的方法就是连接点,所谓连接点也就是在动态执行过程,被织入切面的方法(至少在spring中 只能对方法进行拦截)。因此,在动态过程中通知的执行就属于织入过程,而被织入这些通知的对象就是目标对象了。 通常应用中,被织入的都是事务处理,对事务的织入不是普通简单的织入,它有着事务特有的特性—— 事务的传播特性: 1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启新的事物。 2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。 3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。 4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。 5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。 6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常 7.(spring)PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。 这些都是事务特有的特性,比如前面分析的,如果两个在代码上不相关的操作,需要放在同一个事务中,这就需要利用到传播特性了,这时后调用的方法的 传播特性的值就应该是PROPAGATION_REQUIRED。在spring中只需要进行这样的配置,就实现了生命式的事物处理。 最后一点需要提及的就是Spring事务的隔离级别: 1. ISOLATION_DEFAULT:这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。 2. ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。 3. ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。 4. ISOLATION_REPEATABLE_READ:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。 5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。 除了第一个是spring特有的,另外四个与JDBC的隔离级别相对应。第二种隔离级别会产生脏读,不可重复读和幻像读,特别是脏读,一般情况下 是不允许的,所以这种隔离级别是很少用到的。大多说数据库的默认格里基本是第三种。它能消除脏读,但是可重复读保证不了。第四种隔离级别也有一些数据库作 为默认的隔离级别,比如MySQL。最后一种用的地方不多,除非是多数据访问的要求特别高,否则轻易不要用它,因为它会严重影响数据库的性能
javaeye_mao
浏览: 174344 次
楼主方便给个QQ吗?遇到紧急问题想请教楼主。
不错的文章,谢谢!
相应的jar包呢
分析的很到位,谢谢
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Java中事务的属性ACID
Java中事务的属性ACID
原子性(ATOMICITY):
一个事务要被完全的无二义性的做完或撤消。在任何操作出现一个错误的情况下,构成事务的所有操作的效果必须被撤消,数据应被回滚到以前的状态。
一致性(CONSISTENCY):
一个事务应该保护所有定义在数据上的不变的属性(例如完整性约束)。在完成了一个成功的事务时,数据应处于一致的状态。换句话说,一个事务应该把系统从一个一致-状态转换到另一个一致状态。举个例子,在关系数据库的情况下,一个一致的事务将保护定义在数据上的所有完整性约束。
隔离性(ISOLATION):
在同一个环境中可能有多个事务并发执行,而每个事务都应表现为独立执行。串行的执行一系列事务的效果应该同于并发的执行它们。这要求两件事:
在一个事务执行过程中,数据的中间的(可能不一致)状态不应该被暴露给所有的其他事务。
两个并发的事务应该不能操作同一项数据。数据库管理系统通常使用锁来实现这个特征。
持久性(DURABILITY):
一个被完成的事务的效果应该是持久的。
http://www.linuxprobe.com/
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 数据库事务隔离级别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信