很多复杂的事务要分布进行,但它们组成了一个整体,要么整体生效,要么整体失效。这种思想反应到数据库上,就是多条SQL语句,要么所有执行成功,要么所有执行失败。
数据库事务由严格的定义,它必须满足4个特性:
原子性(Atomicity),一致性(consistency),隔离性(Isolation),持久性(Durability)。
原子性:
表示组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有的操作执行成功,整个事务才提交。事务中的任何一个数据库操作失败,已经执行的任何操作都必须被撤销,让数据库返回初始状态。
一致性
事务操作成功后,数据库所处的状态和他的业务规则是一致的,即数据不会被破坏。如A账户转账100元到B账户,不管操作成功与否,A和B账户的存款总额是不变的。
隔离性
在并发数据操作时,不同的事务拥有各自的数据空间,他们的操作不会对对方产生敢逃。准确地说,并非要求做到完全无干扰。数据库规定了多种事务隔离界别,不同的隔离级别对应不用的干扰成都,隔离级别越高,数据一致性越好,但并发行越弱。
持久性:
一旦事务提交成功后,事务中所有的数据操作都必须被持久化到数据库中。即使在事务提交后,数据库马上崩溃,在数据库重启时,也必须保证能够通过某种机制恢复数据。
在这些事务特性中,数据“一致性”时最终目标,其他特性都是为达到这个目标而采取的措施、要求或手段。
数据库管理系统一般采用重执行日志来保证原子性、一致性和持久性。重执行日志记录了数据库变化的每一个动作,数据库在一个事务中执行一部分操作后发生错误退出,数据库即可根据重执行日志撤销已经执行的操作。对于已经提交的事务即使数据库崩溃,在重启数据库时也能后根据日志对尚未持久化的数据进行相应的重执行操作。