事务的执行保证了数据库的一致性,它不允许出现中间的状态。如果在事务执行之前数据库是处于一个一致性的状态,则在事务执行之后数据库仍然应该是处于一致性状态。因此,为保证这些条件并保持数据库的完整性,数据库事务必须是原子的。原子的事务指的是与事务有关的所有操作全部被执行或者全部不被执行。
事务是一系列组合在一起构成一个数据库访问的Read和Write的动作,每当从数据库中Read或者是向数据库中Write时,就创建了一个事务。一个事务可以由一个简单Select操作组成,也可以由一系列相关的Update命令序列组成等等。改变数据库内容的事务必须将数据库从一个一致性状态转换到另一个一致性状态。一致的数据库状态是指满足所有的数据完整性约束。
事务的执行
上图描述了事务在执行过程中其状态的变化。在事务开始执行时它立刻进入到活动状态,在这个状态它可以产生Read和Write操作。当事务结束时,它进入到部分提交状态。在这个状态,需要一些恢复协议来确保系统失败时不会改变事务更改的持久性,一旦这个检测成功了,就称事务已经到达了它的提交点,并进入到提交状态。一旦事务被提交了,则事务就已经成功地结束了它的执行,而且事务所做的所有更改必须被永久地记录到数据库中。但如果某个检测失败了或者如果事务在活动状态就被终止了,则事务就进入到终止状态,然后事务可能必须要回滚以撤销它的Write操作对数据库的影响。
SQL事务的执行
美国标准化组织(ANSI)已经给出了管理SQL数据库事务的定义,有两个SQL语句来提供对事务的支持,它们是commit和rollback。ANSI标准要求,当用户或者是应用程序开始一个事务序列后,它必须连续地执行全部后续的SQL语句,直到出现下列四个事件之一为止:
到达了一个commit语句。在这种情况下,所有的更改都被持久地级联在数据库中。commit语句自动地结束SQL事务。commit操作表明成功地结束了事务。
达到了一个rollback语句。这种情况下,所有的更改都终止了,并且数据库被回滚到之前的一个一致性状态。rollback操作表明没有成功结束事务。
成功地到达了程序的结束。在这种情况下,所有的更改都被持久地记录到数据库中。这个活动等同于commit。
程序被异常终止了。在这种情况下,所有对数据库进行的更改都被终止,而且数据库被回滚到它之前的一个一致性状态。这个活动等同于rollback。
注:并不是所有的实现都遵守ANSI的标准。
事务的性质
事务必须具有如下四个性质,称为ACID性质,来确保在事务执行之后数据库仍然是稳定的状态:
原子性(atomicity)
一致性(consistency)
隔离性(isolation)
持久性(durability)
原子性:事务的原子性要求事务中的所有操作必须是完整的,如果不是,则事务将终止。换句话说,一个事务被看作是一个单一的、独立的逻辑工作单元。
一致性:数据库一致性是每个事务看到一个一致的数据库实例的性质。
隔离性:事务的隔离性表示一个事务执行期间使用的数据,在其完成之前不能被第二个事务使用。这个性质隔离了每一个事务。换句话说,如果事务T1正在执行,并且正在使用数据项X,则在事务T1结束之前这个数据项不能被任何其他的事务(T2...Tn)访问。事务必须就好像只有它自己在访问数据库一样。
持久性:事务的持久性表明了数据库的一致性状态的性能,它表明事务所做的更改是永久的,它们既不能因为任何的系统失败而丢失,也不能由于不完善事务的错误操作而丢失。
转载于:https://my.oschina.net/fhd/blog/285075