ACID保护您的数据库的数据
数据库设计的ACID模型是数据库理论中最古老也是最重要的概念之一。 它提出了每个数据库管理系统必须努力实现的四个目标:原子性,一致性,隔离性和持久性。 不能满足这四个目标中的任何一个的关系数据库不能被认为是可靠的。 拥有这些特性的数据库被认为符合ACID标准。
ACID定义
让我们花点时间仔细检查每个特征:
- Atomicity声明数据库修改必须遵循“全部或全部”规则。 每笔交易都被称为“原子”。如果交易的一部分失败,整个交易将失败。 数据库管理系统尽管存在任何DBMS,操作系统或硬件故障,仍然保持事务的原子性质,这一点至关重要。
- 一致性规定只有有效的数据将写入数据库。 如果出于某种原因执行违反数据库一致性规则的事务,则整个事务将被回滚,并且数据库将被恢复到与这些规则一致的状态。 另一方面,如果事务成功执行,它将使数据库从一个与规则一致的状态到另一个与规则一致的状态。
- 隔离要求同时发生的多个事务不会影响彼此的执行。 例如,如果Joe在Mary发布不同事务的同时针对数据库发出事务,则两个事务都应以隔离的方式在数据库上运行。 数据库应该在执行Mary's之前执行Joe的整个事务,反之亦然。 这可以防止Joe的事务读取作为Mary事务的一部分副作用而产生的中间数据,这些事务最终不会被提交给数据库。 请注意,隔离属性并不能确保首先执行哪个事务 - 只是这些事务不会相互干扰
- 持久性确保任何提交给数据库的事务都不会丢失。 通过使用数据库备份和事务日志来确保持久性,这些备份和事务日志有助于恢复承诺事务,尽管会出现任何后续软件或硬件故障。
ACID在实践中的工作原理
数据库管理员使用多种策略来强制执行ACID。
一种用于强制原子性和持久性的方法是预写式日志记录 (WAL),其中任何事务细节首先被写入到包含重做和撤消信息的日志中。这确保了在任何类型的数据库故障的情况下,数据库可以检查日志并将其内容与数据库的状态进行比较。
用于解决原子性和持久性的另一种方法是阴影分页 ,其中在要修改数据时创建阴影页面。 查询的更新被写入影子页面而不是数据库中的真实数据。 数据库本身仅在编辑完成时才被修改。
另一种策略称为两阶段提交协议,在分布式数据库系统中尤其有用。 该协议将修改数据的请求分为两个阶段:提交请求阶段和提交阶段。 在请求阶段,网络上受交易影响的所有DBMS必须确认他们已收到并有能力执行交易。 一旦从所有相关的DBMS接收到确认,提交阶段就会完成,其中数据实际上被修改。