什么是事务?事务通俗的讲就是要作的事,在计算机术语中通常指访问或更新数据库中数据的一个工做单元。提及事务,那么就要提到事务的ACID特性,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。但是为何提及事务就要提到这四个特性,这四个特性是一个事务必须遵照的标准呢仍是对事务的一个指望目标呢,对于这个疑问,我有本身的理解。数据库
事务通俗的将是要作的事,那么事务的特性就相似于操做规范,按照操做规范来作事就能够尽可能避免发生措手不及的问题,最终把事情作好。若是把要作的事拆解一下,一般的步骤就是准备,定好目标,执行,得到结果。对于计算机事务来讲,执行一个工做单元,正确完成对数据库的访问或更新,使数据库从一种状态转换成另外一种状态,这个执行过程就是计算机事务。如何从事务开始到结束来保证它的正确性,实现最终目标,这须要靠每一个步骤上的正确执行来保证获得最后的正确结果。为了保证每一个步骤的正确执行,就有了这四个特性。并发
为了说明事务的特性,举个窗口购买火车票的例子。首先简单的分析一下,在购买火车票以前咱们须要准备好身份证件和现金,最终结果是咱们支付现金而且得到火车票。可是若是购票业务没作好,会出现那些状况呢。下面大体列举一下:atom
一、乘客获得了火车票却没有给售票员付钱。spa
二、在办理购票业务的时候提示票已售完。设计
若是现实中真的出现了这些问题,那是谁都不肯意的看到的。所以为了保证购票业务的正确执行,必须把付钱和获得火车票当作一个总体,要么付钱并获得火车票,要么退钱结束购票。事务
并且在购票的过程当中,便锁定客户的票,不能让它被其余窗口买走。ci
例子是这样一个简单的例子,但用来讲明事务的特性倒是足够了。开发
原子性即不可分割性,含义是一个事务必须把它产生的全部更改做为一个单独的工做单元进行提交或者回滚。不管有多少变更都将做为一个总体来处理。怎么来保证事务的原子性首先在事务开始以前对事务进行拆解,分析哪些动做是必须同时成功,同时失败的,把这些绑在一块儿的动做当作一个完整的工做单元,这些动做要步调一致。这其实也就是作好一件事以前的准备阶段。用窗口购票的例子来讲就是把乘客付钱和获得火车票当作是一个总体。文档
一致性的意思是事务执行的结果必须是使数据库从一个一致性状态变到另外一个一致性状态(其实也就意味着在事务期间,对数据的增删改要符合数据的完整性约束)。像这种比较正式的说法每每是用一个抽象的描述去形容另一个抽象的东西,结果是更加糊涂了。购票这个例子中,所谓的一致性就是现金必须从乘客的手中扣除,而同时火车票也必须被卖出并交到乘客的手上。因此简单点说,就是工做单元中每一个动做的执行结果必须被落实,不能出现有的成功了而有的失败了。这就是作好一件事所要达到的既定目标,只要当这件事的全部环节都完成之后才能算这件事完成了。it
隔离性,在有的地方也叫独立性,其实意思都差很少。隔离性指的是各个独立事务之间的交互程度,是由一致性和并发性共同决定的。像购票的这个例子,若是同时有多名乘客在不一样的窗口购票,若是处理不当,极可能在购票的时候会出现两个或两个以上的窗口锁定同一张火车票,并进行售卖的状况,最终不能保证事务的一致性。并发性越低,事务的隔离性越高,一致性也就越高。当提升事务的隔离性的时候,就极可能须要牺牲数据库的并发性来保证数据的一致性。因此当设置事务的隔离级别的时候,就须要综合考虑事务的一致性和并发性。所以通俗讲事务的隔离性就是指的事情应该怎么作。关于事务的隔离性以及隔离级别稍后会有详细说明。
持久性指的是一个事务一旦提交,那它对数据库的更改就应该是永久的,不会因系统的失败而丢失。当完成购票之后,售票员获得乘客的车票钱,乘客获得售票员给的车票,不能由于售票系统的崩溃就对既有事实进行抵赖,因此从某种程度上来讲,持久性也能够指不可抵赖性,签字盖章,交易完成。这就是事情的最终结果。
PS:把事务理解成将要作的事,从本身如何确保作好一件事的角度来考虑就比较容易理解事务的几个特性,毕竟咱们本身也作过不少事,也遇到过各类各样的问题。好比好比项目组成员共同开发项目,一人一个模块,有的人完成了,有的人没完成,致使项目总体进度出现异常,这些都说明了事务的原子性和一致性。手头正作着工做,忽然上头又让作别的工做,杂七杂八的,最终本来的工做不必定能按时完成,包括代码的检出、检入的时候出现的代码冲突和覆盖等问题,也都体现了事务的隔离性。工做的沟通中,口头说的容易忘,也很容易需求变动,这时候就须要编写需求说明,需求分析以及详细设计等文档以及保留来往邮件做为结果产物做为依据。