举个简单的例子来说明事务

声明,本文来自《spring in action》(作者Craig Walls)一书,只做知识的分享。

 

6. 1  理解事务为了说明事务,让我们假设要去买一张电影票。买电影票这件事,通常涉及以下几个行为:

■  检查空余座位的数量,以便核实有足够的座位供你购买。

■  每卖出一张票,空余座位的数量就减少一个。

■  你为电影票付款。

■  将电影票发给你。

如果一切正常的话,你便将可以享受一部大片的乐趣,而电影院则将多几美元的收入。但是,如果有些环节出错了呢?例如,如果你使用一张已经达到限额的信用卡来支付,结果会怎么样呢?当然了,你不会拿到电影票,电影院也收不到你的钱。但是,如果座位的数量没有被复位到这次购买之前的那个数值,那么这场电影就可能会被人为地耗尽座位(从而损失销售额)。再或者,如果其他每一件事情都运行正常,但就是电影票发不出来。那么你将会损失几美元,并且只能待在家里通过有线电视观看重新放映的影片了。为保证不管是你还是电影院都不受损失,上述这些行为都应该被打包在一个事务里。

作为一个事务,它们将被视作一个单一的行为,保证它们要么都完全成功,要么全部都被回滚,好像什么也没有发生过。

图6. 1 展示了这个事务是怎样结束的。

买电影票

 

购买电影票时涉及的这些步骤要么全部成功,要么一步都不发生。如果每一步都成功了,那么整个事务就是成功的;否则,这些步骤都应该被回滚——就好像它们从来没有发生过一样事务在软件中扮演了一个重要的角色,用于确保数据和资源永远不会处在一种不一致的状态下。没有事务,就可能会出现数据被破坏,或者是应用程序中的业务规则缺乏一致性。在我们过于着迷于Spring 的事务支持之前,需要先理解事务的关键成分。下面让我们快速看一下指导事务的4 个要素,以及它们是如何工作的。

6. 1. 1  仅用4 个词解释事务在主要的软件开发传统中,有一个描述事务的首字母缩写词:ACID。

简而言之,ACID 代表:

■  原子性(Atomic)——事务由一个或多个行为捆绑在一起组成,好像是一个单独的工作单元。原子性确保在事务中的所有操作要么都发生,要么都不发生。假如所有行为都成功了,那么相应的事务就是成功的。假如任何一个行为失败了,那么整个事务就失败了,并且被回滚。

■  一致性(Consistent)——一旦一个事务结束了(不管成功与否),系统所处的状态和它的业务规则是一致的。用现实中的话,就是说数据应当不会被破坏。

■  隔离性(Isolated)——事务应该允许多名用户操作同一个数据,一名用户的操作不会和其他用户的操作相混淆。因此,事务必须是互相隔离的,防止并行读写同一个数据的情况发生。注意,隔离通常意味着要锁定数据库里的记录行和(或)表。

■  持久性(Durable)——一旦事务完成,事务的结果应该持久化,这样不管什么样的系统崩溃,它们都将幸免于难。通常把事务的结果保存在数据库或其他形式的持久化存储设备中。

在上述的电影票示例中,当任何一步失败了,事务就能通过撤销所有步骤的结果来保证原子性。原子性支持一致性,因为它确保系统中的数据永远不处于一种不一致的、部分完成的状态。隔离性也支持一致性,因为当你仍处于买票过程中时,它防止另一个并发的事务抢了你的座位。最后,结果将被持久化,因为它们将提交到某个持久化存储中。当系统崩溃或发生其他灾变性事件时,你就不用担心该事务的结果会丢失。

posted @ 2015-04-10 23:31  jinhuazhe2013  阅读(1088)  评论(0)    收藏  举报