我们说到数据库的时候 , 常常提到其 ACID 属性 。那么 ACID 是什么意思呢?
ACID 是用来描述数据库事务的属性 。反过来说,满足 ACID 属性的一系列数据库操作被称为事务 。
下图解释了 ACID 在数据库事务中的含义 。
文章插图
图片
01 原子性(Atomicity)事务中的写操作是一次性执行的 , 不能分解成更小的部分 。如果在执行事务时出现故障,同一个事务中的写入将被回滚 。应用程序可以安全地重试同一事务,而不会产生任何副作用 。
【数据库的 ACID 属性是什么意思?】因此,原子性意味着 "全有或全无"(All or Nothing) 。
02 一致性(Consistency)CAP 定理中的 "一致性 "是指每次读取都会收到最近的写入或错误 。与 CAP 定理不同的是,这里的一致性是指保留数据库的不变性 。事务写入的任何数据都必须符合事先定义的规则,并保持数据库处于良好状态 。比如我们在数据库中设置了 Trigger 用来更新关联表,那么数据写入后必须保证其正确执行 。
03 隔离(Isolation)当有来自两个不同事务的并发写入时,这两个事务是相互隔离的 。最严格的隔离是 "序列化"(serializability),即每个事务运行时都像数据库中唯一运行的事务一样 。然而,这在现实中很难实现,所以我们通常采用较弱的隔离级别 。
04 持久化(Durability)事务提交后,即使系统发生故障,数据也会被持久化 。数据库会使用预写日志(Write-Ahead Log)或类似机制来确保持久化 。在分布式系统中,持久化意味着数据会复制到其他节点 。
神书 DDIA (Designing Data Intensive Applications) 中关于 ACID 有几点很好的见地,值得我们思考:
- 一致性其实是应用程序的责任,而不是数据库的职责范围 。应用程序可以使用原子性和隔离来保证数据的一致性 。而数据库系统只能保证各种数据库规则被执行了 。
- ACID 四个属性中只有隔离是用来描述并发情况的,原子性并不描述并发情况 。
- 各个弱隔离级别都会带来一些限制,我们需要清楚其底层机制 。
推荐阅读
- std::atomic 现代C++中的原子:详解、代码及应用
- 理解 Spark 写入 API 的数据处理能力
- 让Node.js加速你的网络应用开发之旅
- 为什么 Qt 成为 c++ 界面编程的第一选择
- 构建更好的基于LLM的应用程序的四大秘诀
- 分析SEO优化网站有哪些特点
- 从网站优化和关键词选择看网站排名的四大秘密
- 人脸识别技术:应用与隐私挑战的探讨
- 蜘蛛抓取规律与外链及时性的探索
- 关键词排名不稳定多半是页面标题规范问题的解决方法