我正在寻找数据库的各种 ACID 属性的真实示例。
3 回答
原子性- 将资金从一个账户转移到另一个账户的交易涉及从第一个账户进行提款操作和对第二个账户进行存款操作。如果存款操作失败,您也不希望提款操作发生。
一致性- 跟踪支票账户的数据库可能只允许每笔交易存在唯一的支票号码
隔离- 查询余额的出纳员必须与涉及从同一账户取款的并发交易隔离。只有提款交易提交成功,出纳员再次查看余额时,才会上报新的余额。
持久性 - 不允许系统崩溃或任何其他故障丢失事务结果或数据库内容。持久性通常是通过单独的事务日志来实现的,这些日志可以从某个选定的时间点(如备份)“重新创建”所有事务。
(来自 le dorfier链接的真实世界示例摘要)
• 原子性——从用户的角度来看,一个事务要么全部完成(即所有相关的数据库表都已更新),要么根本不完成。如果发生错误或中断,则撤消到该点所做的所有更改。
• 一致性——数据库中的所有完整性条件在每个事务中都得到维护,将数据库从一种一致状态转变为另一种一致状态。
• 隔离——每个事务都与其他事务隔离,因此,每个事务只访问属于一致数据库状态的数据。
• 持久性——如果事务已完成报告给用户,则对数据库的结果更改在随后的硬件或软件故障中仍然存在。
拿任何你用来操作关系数据库中数据的给定 perl 脚本,在它的顶部放一个“BEGIN”,在底部放一个“COMMIT”,你就知道 perl 脚本有效,或者没有影响你的数据库(除非您在 mysql 上插入 DDL 语句)。在设计健壮的软件(以及我最喜欢的属性)时,原子性非常强大,可以保证这样的保证。