事务就是一个或一组操作,它具有原子性,即不可分割,同时成功或同时失败,失败之后能回滚到最初状态。
这个说的有些不明白。
能否说的详细点。最好要有类比。
谢谢深谙此道的人。
只要有一个地方出错,就要统统回滚;也就是说,这里所有的保存是一个整体,不可分割,[color=red]就是这个意思[/color],
你不用怀疑,这由程序里配置的事务来控制的
所谓的事务部是hibernate事务 是操作数据都需要事务
事务就是完成一件事 举个例子 你去银行转帐 首先数据需要消除你帐户的金额 然后把金额放到你要转入的用户那里
如果中间出现问题 你的金额没了 要转入的用户也没拿到 那样就麻烦了 呵呵
所以事务就是不可分割的事情
只要是完成一件事 无论是数据库操作还是操作mq等 都需要事务
事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列。事务ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
原子性:保证事务中的所有操作全部执行或全部不执行。例如执行转账事务,要么转账成功,要么失败。成功,则金额从转出帐户转入到目的帐户,并且两个帐户金额将发生相应的变化;失败,则两个账户的金额都不变。不会出现转出帐户扣了钱,而目的帐户没有收到钱的情况。
一致性:保证数据库始终保持数据的一致性——事务操作之前是一致的,事务操作之后也是一致的,不管事务成功与否。如上面的例子,转账之前和之后数据库都保持数据上的一致性。
隔离性:多个事务并发执行的话,结果应该与多个事务串行执行效果是一样的。显然最简单的隔离就是将所有事务都串行执行:先来先执行,一个事务执行完了才允许执行下一个。但这样数据库的效率低下,如:两个不同的事务只是读取同一批数据,这样完全可以并发进行。为了控制并发执行的效果就有了不同的隔离级别。下面将详细介绍。
持久性:持久性表示事物操作完成之后,对数据库的影响是持久的,即使数据库因故障而受到破坏,数据库也应该能够恢复。通常的实现方式是采用日志。
文章出处:DIY部落(http://www.diybl.com/course/7_databases/database_other/200855/113472.html)
举最经常说的例子就是银行转帐,,事务就是一次转账过程。
包括一个的很转出,和另一个的钱转入,,如果有任何一个人的环节失败,那么事务就是失败的。
所以其包括四个特性:
原子性:说白了就是要么成功,要么失败。
一致性:说白了,,转账没成功不要紧,钱不能搞错了,转之前多少钱,,转之后还是多少钱。
分离性:这个有点抽象,就是说转账过程是隔离的,不允许那个人给你转账时,还同时发生转账给别人的情况。其实这点最主要的用途是保证资源的统一,防止脏数据产生。
持久性:这个说转账过程要有意外的抵抗能力,转账过程要同时持久化,当有转账机器故障等意外情况下能够继续。
[url]http://www.cncfan.com/html/?80_6658.html[/url]
设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作:
· 更新客户所购商品的库存信息
· 保存客户付款信息--可能包括与银行系统的交互
· 生成订单并且保存到数据库中
· 更新用户相关信息,例如购物数量等等
正常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常、该顾客银行帐户存款不足等,都将导致交易失败。一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态--库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信息将会一片混乱而不可预测。
数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。
[quote]user.save(user);
other.save(other); [/quote]
是会一起回滚的,为什么一起回滚?其实事务回滚的原理,是事务里公用一个数据库连接,[color=red]只要在这一个事务里,用的都是这一个连接[/color],只有当执行到最后没有抛出异常的时候,才会执行commit操作的。如果在执行过程中有任何一个地方抛出异常的话,事务都会回滚。