什么是数据库中的原子性?
什么是数据库中的原子性?
原子性是一种数据库特征,表示数据库对故障的响应。数据库允许您存储和读取一系列事务中的数据。故障可能随时发生,包括在事务中。原子性表明每笔事务要么完全完成,要么根本未完成。无论何时发生故障,原子数据库事务都能确保数据一致性。
为什么原子性很重要?
每个数字活动中都会使用数据库,从航空公司订票到财务转账。数据不一致可能会产生严重的财务和法律影响。例如,考虑两个银行账户之间的汇款。您希望从账户 A 中扣除这笔钱,然后存入账户 B。这个过程不允许出错,如果 A 中的资金减少,则应将完全相同的金额添加到账户 B;否则,两个账户应保持不变。
许多此类关键场景对数据不一致的容忍度为零。在应用层面为每种场景进行规划和故障处理极具挑战性。相反,数据库设计人员构建了从一开始就能够抵御故障的数据库引擎。一个数据库事务中请求的所有数据操作都已成功完成或根本未完成。这样,应用程序设计人员就知道无论何时或发生什么错误,他们的数据库一致性都将始终保持不变。
原子性在 ACID 中的作用是什么?
原子性、一致性、隔离性、持久性 (ACID) 是指关系数据库中事务的四个关键属性。关系数据库以结构化表格的格式存储数据和数据之间的关系。即使面对系统故障,ACID 属性也可以共同确保数据的完整性和可靠性。
- 原子性可防止部分更改。
- 一致性可维持数据完整性。
- 隔离性可以安全地管理并发性。
- 持久性可保证已提交的更改持续下去。
原子性
原子性确保将事务视为一个单一的、不可分割的工作单元 — 所有操作都成功完成,或者不进行任何操作。这样可以防止可能使数据库处于不一致状态的部分更新。
一致性
一致性建立在原子性的基础之上,确保事务将数据库从一个有效状态转换到另一个有效状态。它强制执行所有已定义的规则,例如约束或触发器,因此无论事务的结果如何,数据库的完整性都不会受到损害。
隔离性
隔离性可确保并发事务不会相互干扰。每个事务在执行时,都如同在给定时刻只有它在运行一般。这样可以防止出现脏读、更新丢失或结果不一致等问题,从而确保事务不会无意中相互影响。
持久性
持久性可确保事务一旦提交,其影响就是永久性的,即便系统发生崩溃也不例外。这是通过预写日志等机制实现的,这些机制允许数据库在事务失败时恢复提交的数据。
原子性如何支持复杂事务?
复杂事务是一种数据库事务,它将跨表甚至跨数据库的多个操作分组。它通常包括相互依赖的读取、写入、更新和删除的组合。例如,预订系统可能需要在分配资源之前确认可用性。检查和分配都是单个事务的一部分。
原子性支持复杂事务,如下所示。
防止部分更新
原子性允许数据库系统将整个事务视为一个单元,即使多个复杂事务同时在数据库上运行。它确保在事务的任何部分失败时回滚所有先前的更改。数据库永远不会处于不一致的状态。
例如,以预订音乐会门票事务为例,包含以下步骤。
- 核实座位情况。
- 锁定座位。
- 处理付款。
- 更新预订记录。
如果在步骤 3 中付款失败,座位将保持解锁状态,不会记录任何预订,系统中也不会保留不完整的数据。因此,原子性可以保证数据始终保持有效。
保持完整性
复杂的事务需要数据库管理系统来实现锁定机制。锁定会限制对资源(例如行、表格或页面)的访问,直到持有该锁的事务完成并释放它为止。它们至关重要,能够防止多个事务并行运行时发生冲突,并防止两个事务同时尝试更新相同数据时的数据不一致问题。
原子性可确保即使在锁定状态下数据库状态也能保持一致。其他事务或用户无法看到中间或部分更新。如果事务失败或中止,将完全撤消其更改,从而避免冲突或连锁故障。
简化错误处理
在复杂事务中,更有可能出现违反约束、死锁或系统崩溃等错误。原子性可确保数据库在发生故障时自动恢复到其先前状态。
启用嵌套事务
可以将复杂的事务分解成较小的嵌套事务,以减少争用或提高重试效率。原子性可确保每个嵌套事务保持一致,嵌套操作中的任何故障都可以在不影响其他事务组件的情况下得到解决。
数据库管理中原子性设计的局限性是什么?
原子性需要在性能上进行大规模权衡来确保状态的一致性。在事务中包含过多的操作会降低吞吐量并增加死锁的风险。
当多个事务周期性地相互阻塞时,就会发生死锁。事务会维持数据处于锁定状态,直到它们被提交或中止,从而阻止其他事务访问这些资源。例如,
- 事务 A 已锁定事务 B 完成所需的数据。
- 事务 B 已锁定其他一些数据,并在等待 A 的同时完成了一半操作。
- 事务 C 正在等待 B 释放数据,但锁定了 A 需要的其他数据。
- 任何事务都无法进行,从而导致死锁。
即使没有死锁,由于事务不断等待其他事务完成,数据库性能也会降低。
原子性替代方案
非关系型(NoSQL 数据库)是在规模化场景下提升性能的一种替代方案。NoSQL 数据库采用了 BASE 模型,该模型可避免锁定。在 BASE 模型中:
- 基本可用 (BA) 表示即使出现部分故障,系统仍可运行。
- 软状态 (S) 承认系统的状态可能会因最终更新而随时间发生变化。
- 最终一致性 (E) 可确保虽然一致性不是立竿见影的,但数据库最终会达到一致状态。
NoSQL 数据库没有对多个操作强制执行严格的原子性,而是在单个文档或数据记录中强制执行原子性,从而减少了对复杂锁定机制的需求。数据分布在多个节点上,但为了最终保持一致性,新数据是异步写入的。
更新以增量方式传播,而不是锁定资源以实现即时全局一致性。可用性和性能优先于原子性和一致性。
AWS 如何满足您的数据库需求?
AWS 云数据库为每种类型的数据使用案例提供了一系列 ACID 和 BASE 数据库服务。组织在 AWS 上部署数据库可以节省预置、扩展和管理数据存储基础设施的时间。
Amazon Relational Database Service (Amazon RDS) 是一个托管式服务的集合,可以简化在云中设置、操作和扩展 ACID 数据库的过程。您可以使用上述及其他关系型数据库引擎。
- 使用 Amazon RDS for SQL Server 部署多个版本的 SQL Server
- 使用 Amazon RDS for MySQL 支持 MySQL 社区版
- 使用 Amazon RDS for MariaDB 支持 MariaDB Server
AWS 还提供多项 NoSQL 数据库服务,可满足您的所有 NoSQL 需求。下面是一些示例:
- Amazon DynamoDB 是一项键值数据库服务,可以为任何规模的工作负载提供一致且延迟低于 10 毫秒的性能。
- Amazon DocumentDB(与 MongoDB 兼容)是流行的面向文档的数据库,提供强大且直观的 API。
- Amazon MemoryDB 是一项持久的内存数据库服务。
- Amazon Neptune 是一项完全托管的图形数据库服务。
立即创建账户,开始在 AWS 上使用 ACID 和 BASE 数据库。
Browse all cloud computing concepts
Browse all cloud computing concepts content here:
Did you find what you were looking for today?
Let us know so we can improve the quality of the content on our pages