前言
设 Ti 是从账户 A 过户 $50 到账户 B 的事务。这个事务可以定义为:
Ti: read(A); A := A - 50; write(A); read(B); B := B + 50; write(B);
正文
一致性(consistency):
一致性要求事务的执行不改变 A、B 之和。如果没有一致性要求,金额可能会被事务凭空创造或销毁!容易验证,如果数据库在事务执行前是一致的,那么事务执行后数据仍将保持一致。
确保单个事务的一致性是编写该事务的应用程序员的责任。完整性约束的自动检查会给这项工作带来便利。
原子性(atomicity):
假设事务 Ti 执行前账户 A 和账户 B 分别有 1000和2000。现在假设在事务 Ti 执行时系统故障,导致 Ti 的执行没有成功完成。我们进一步假设故障发生在 write(A) 操作执行之后 write(B) 操作执行之前。在这种情况下,数据库中反映出来的是账户 A 有950,而账户B有2000。这次故障导致系统丢失了 $50。特别地,我们注意到 A + B 的和不再维持原状。
这样,由于故障,系统的状态不再反映数据库本应描述的现实世界的真是状态。我们把这种状态称为不一致状态(inconsistent state)。
这样,如果一个事务或者不开始,或者保证完成,那么这样的不一致状态除了在事务执行当中意外,在其他时刻是不可见的。这就是需要原子性的原因:如果具有原子性,某个事务的所有动作要么在数据库中全部反映出来,要么全部不反映。
持久性(durability):
一旦事务成功地完成执行,并且发起事务的用户已经被告知资金转账已经发生,系统就必须保证任何系统故障都不会引起与这次转账相关的数据丢失。持久性保证一旦事务成功完成,该事务对数据库所做的所有更新就都是持久的,即使事务执行完成后出现系统故障。
隔离性(isolation):
如果几个事务并发地执行,即使每个事务都能确保一致性和原子性,他们的操作会以人们所不希望的某种方式交叉执行,这也会导致不一致的状态。
事务的隔离性确保事务并发执行后的系统状态与这些事务以某种顺序以某种次序一个接一个地执行后的状态是等价的。确保隔离性是数据库系统中称作并发控制系统的部件的责任。