购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.2 数据库事务

对一个数据库来说,在其内部存储数据的过程也许是很复杂的操作。某些情况下,它可能包括修改某个地方的数据,但有时也许会在一个操作中影响到数百万条记录,例如,“更新此时间戳之前创建的所有记录”这个操作。

这些操作的作用范围和合理性如何,高度取决于数据库,但它们与关系数据库非常相似。在这种情况下,通常会涉及事务的概念。

事务是一次性完成的操作。它要么发生,要么不发生,但数据库不会处于中间的状态而导致数据不一致。例如,如果前面所说的操作“更新此时间戳之前创建的所有记录”,会出现由某个错误而导致只有一半的记录被更新这样的情况,那么它就不是一个事务,而是多个独立的操作。

可能出现的情况是,在一个事务的中间出现错误。此时,数据将回到执行事务操作前的初始状态,所以不会有任何记录被更新。

这个特性在某些应用中会被当作对数据库的强制性要求,称为原子性(Atomicity)。也就是说,事务在执行时是原子性的。原子性是被称为ACID的四大特性中的主要特性之一。

ACID中的其他几个特性是一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这四个特性的具体含义如下:

原子性 意味着事务是作为一个单元来执行的。它包含的操作要么全部发生,要么不发生。

一致性 表示事务的操作要符合数据库中定义的所有限制。例如,符合外键约束,或所有修改数据的存储触发器都将被应用。

隔离性 意味着并行事务的工作方式与它们逐个运行的方式相同,即确保每个事务都不会被其他事务影响。显然,与此不同的是,事务运行顺序的差异可能会影响结果。

持久性 表明当一个事务确实完成后,即使发生灾难性的故障,如数据库进程崩溃,数据也不会丢失。

这些特性是数据管理的黄金准则。符合ACID即意味着数据是安全和一致的。

大多数关系数据库都有这样的概念:启动某个事务后,执行几个操作,然后最终提交事务,这样所有的变化都会一次性提交生效。如果出现问题,事务会失败,恢复到之前的状态。在执行操作的过程中如果发生任何问题,比如约束条件不满足,事务也会被中止。

这种方式允许执行更多步骤的验证操作,因为在执行事务的过程中,依然可以查询中间状态的数据,从而在最终提交之前对其进行验证。

ACID事务在性能方面是有代价的,特别是在可扩展性方面。对持久性的需求意味着数据在从事务中返回之前需要存储在磁盘或其他永久性存储上。隔离性需求意味着每个打开的事务都要以不能看到数据最新状态的方式运行,这样就需要在事务完成之前存储临时数据。一致性则需要复杂的检查,以确保满足所有的约束条件。

几乎所有的关系数据库都是完全符合ACID的,这已经成为它们的决定性特征之一。非关系数据库则灵活一些。

即使如此,事实证明,用多个具有这些特性的服务器或节点来扩展数据库系统也是很困难的。这类系统创建了分布式事务,同时在多个服务器上运行。在由多个服务器组成的数据库中维护完全遵循ACID的事务相当不容易,而且在性能方面也会有很大的损失,因为系统要了解其他数据库节点所做的事情,并在其中任意一个节点出现故障时回滚事务,这会造成额外的延时。这些问题还会以非线性的方式增加,某种程度上违背了通过多个服务器进行系统规模扩展以提高性能的初衷。

虽然可能会出现这些情况,但很多应用程序都可以规避这些局限。后文中我们将看到一些有效的应对方法。 bTC9vMn6KJUVA7AiRix0cvpfuA9jNeXs7kGfJyRLBS0giMwxDF4iQmQD0qK7zfmT

点击中间区域
呼出菜单
上一章
目录
下一章
×