事务(Transaction),通常是指要作的或所作的事情。在计算机术语中是指访问并可能更新数据库中各类数据项的一个程序执行单元(unit)。在计算机术语中,事务一般就是指数据库事务。数据库
一个数据库事务一般包含对数据库进行读或写的一个操做序列。它的存在包含有如下两个目的:并发
一、为数据库操做提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即便在异常状态下仍能保持一致性的方法。
二、当多个应用程序在并发访问数据库时,能够在这些应用程序之间提供一个隔离方法,以防止彼此的操做互相干扰。spa
当一个事务被提交给了DBMS(数据库管理系统),则DBMS须要确保该事务中的全部操做都成功完成且其结果被永久保存在数据库中,若是事务中有的操做没有成功完成,则事务中的全部操做都须要被回滚,回到事务执行前的状态(要么全执行,要么全都不执行);同时,该事务对数据库或者其余事务的执行无影响,全部的事务都好像在独立的运行。操作系统
但在现实状况下,失败的风险很高。在一个数据库事务的执行过程当中,有可能会赶上事务操做失败、数据库系统/操做系统失败,甚至是存储介质失败等状况。这便须要DBMS对一个执行失败的事务执行恢复操做,将其数据库状态恢复到一致状态(数据的一致性获得保证的状态)。为了实现将数据库状态恢复到一致状态的功能,DBMS一般须要维护事务日志以追踪事务中全部影响数据库数据的操做。日志
并不是任意的对数据库的操做序列都是数据库事务。事务应该具备4个属性:原子性、一致性、隔离性、持久性。这四个属性一般称为ACID特性。事务
原子性(Atomicity):事务做为一个总体被执行,包含在其中的对数据库的操做要么所有被执行,要么都不执行。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另外一个一致状态。一致状态的含义是数据库中的数据应知足完整性约束。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不该影响其余事务的执行。
持久性(Durability):一个事务一旦提交,他对数据库的修改应该永久保存在数据库中。ci
用一个经常使用的“A帐户向B帐号汇钱”的例子来讲明如何经过数据库事务保证数据的准确性和完整性。熟悉关系型数据库事务的都知道从账号A到账号B须要6个操做:it
一、从A帐号中把余额读出来(500)。
二、对A帐号作减法操做(500-100)。
三、把结果写回A帐号中(400)。
四、从B帐号中把余额读出来(500)。
五、对B帐号作加法操做(500+100)。
六、把结果写回B帐号中(600)。io
保证1-6全部过程要么都执行,要么都不执行。一旦在执行某一步骤的过程当中发生问题,就须要执行回滚操做。 假如执行到第五步的时候,B帐户忽然不可用(好比被注销),那么以前的全部操做都应该回滚到执行事务以前的状态。程序
在转帐以前,A和B的帐户中共有500+500=1000元钱。在转帐以后,A和B的帐户中共有400+600=1000元。也就是说,数据的状态在执行该事务操做以后从一个状态改变到了另一个状态。同时一致性还能保证帐户余额不会变成负数等。
在A向B转帐的整个过程当中,只要事务尚未提交(commit),查询A帐户和B帐户的时候,两个帐户里面的钱的数量都不会有变化。
若是在A给B转帐的同时,有另一个事务执行了C给B转帐的操做,那么当两个事务都结束的时候,B帐户里面的钱应该是A转给B的钱加上C转给B的钱再加上本身原有的钱。
一旦转帐成功(事务提交),两个帐户的里面的钱就会真的发生变化(会把数据写入数据库作持久化保存)!
一致性与原子性是密切相关的,原子性的破坏可能致使数据库的不一致,数据的一致性问题并不都和原子性有关。
好比刚刚的例子,在第五步的时候,对B帐户作加法时只加了50元。那么该过程能够符合原子性,可是数据的一致性就出现了问题。
所以,事务的原子性与一致性缺一不可。