关系数据库依靠某些属性来确保数据的可靠性和可信度。这些属性用首字母缩略词 ACID 来概括,分别代表原子性、一致性、隔离性和持久性。在本博客中,我们将使用现实生活中的场景和示例深入研究这些属性。
原子性:全部或无
原子性确保事务被视为单个单元,该单元要么完全完成,要么完全中止。
示例:考虑一个场景,您将 100 美元从用户 A 转账给用户 B:
初始状态:
用户A:1000美元
用户B:500美元
如果在传输过程中,数据库在从用户 A 扣除 100 美元之后但在将其添加到用户 B 之前崩溃,则原子性可确保事务回滚到原始状态:
回滚状态:
用户A:1000美元
用户B:500美元
隔离:保护您的交易不受彼此影响
数据库中术语“隔离”的核心是保护的概念。将每笔交易想象成一个小泡沫。隔离可确保这些气泡不会破裂或相互混合。通过这样做,它可以保证我们的数据安全无害。
揭开阅读现象:
当我们谈论“读取现象”时,我们讨论的是事务重叠时可能发生的意外情况。让我们逐一看看:
脏读:想象一下有人正在打扫房间时偷看房间。一切都散了,一片狼藉。类似地,脏读就像查看另一个事务仍在更改的数据。由于这种变化可能会逆转,因此您所看到的内容可能不会持续存在。
不可重复读取:想象一下您记下篮子里苹果的数量。一分钟后,你再次数数,但数字发生了变化,因为有人拿走了或添加了一个苹果。这就是这里发生的事情;您在事务开始时读取的数据可能会在事务完成时发生变化。
幻读:这就像检查一篮子里有苹果,然后在下一次检查中发现橘子。真是出乎意料啊!当事务期间出现新数据(如那些神秘的橙子)时,就会发生幻读。
丢失的更新:想象一下两位艺术家在同一张画布上绘画。如果他们在彼此的作品上作画,他们的贡献之一可能会消失。同样,当两个事务尝试更改同一数据时,其中一个更改可能会被忽略。
隔离级别 - 设置边界:
不同的隔离级别决定了我们保护交易泡沫的严格程度:
未提交的阅读:这就像一个门开着的房间。你可以看到里面发生的一切,无论它是否完成。您可以看到其他事务正在进行的(未提交的)更改和已完成的(已提交的)更改。
已读承诺:现在,门已微闭。只有当事情完成并解决后你才能看到它们。此级别允许您仅查看其他事务中已完成的更改。
可重复阅读:想象一下,数一下篮子里的苹果,然后在篮子周围放一个防护罩,这样就没有人可以改变计数。在此级别下,您读取的任何数据在整个交易过程中都保持一致。
快照:这就像给房间拍一张照片。即使内部情况发生变化,您也会始终查看照片,保持一致。从交易开始,您就会看到数据的“冻结”视图。
可序列化:想象一座狭窄的桥,一次只能一个人通过。交易排队等候,确保它们不会相互干扰。
隔离级别比较:
一致性:将其想象为事实检查器
在数据库的世界里,“一致性”就像有一个细致的事实检查员,确保一切都匹配并且没有矛盾。它确保数据库中的每条信息都是可靠且值得信赖的。
用一个简单的类比来理解数据一致性:
想象一下您正在翻阅一本相册。每张照片下方都有一个数字,表示该照片在社交媒体平台上被点赞的次数。
现在,除了这张相册之外,您还有一本日记,记录了谁喜欢了哪张照片。如果相册中的一张照片有 5 个赞,那么您的日记中应该有 5 条喜欢该照片的人的条目。如果专辑说有5个赞,但日记里只列出了3个名字,那就没有意义了,对吧?这就是我们所说的数据一致性——确保数据库中不同位置的相关数据匹配。
简单来说数据一致性:
相册(表一):猫的照片 - 5 赞
日记(表2):爱丽丝喜欢这张猫的照片。鲍勃喜欢这张猫的照片。卡拉喜欢这张猫的照片。大卫喜欢这张猫的照片。艾玛喜欢这张猫的照片。
如果相册和日记之间存在任何不匹配,我们值得信赖的事实检查员(一致性)会指出并说:“嘿,这里有些不对劲!”
了解书籍示例的阅读一致性:
现在,假设您已经写了一本书并且拥有主副本(主要)。为了让更多人阅读它,您创建了这本书的副本(副本)。
如果您对主副本进行更改(例如编辑段落),副本也应反映该更改。如果有人在您进行编辑后立即拿起副本进行阅读,那么他们最好会看到最新版本。如果不是立即,那么不久之后。这确保了无论某人正在阅读主书还是其中一本副本,他们都能获得一致的信息。
用数据库术语来说,即使有一点点延迟(因为在任何地方进行更改都需要一点时间),我们也应该达到更新每个副本的程度。这称为“最终一致性”。
耐用性:将其视为保存游戏进度
在数据库世界中,持久性就像保存电子游戏中的进度一样。想象一下,您正在玩一个具有挑战性的关卡,经过数小时的努力,您终于征服了它。您不想冒失去进度的风险,对吗?您需要保存游戏,以确保即使发生断电或游戏机重新启动,您也不必再次玩该关卡。这正是持久性对数据库所做的事情;它确保一旦进行更改,无论发生什么情况,都会保存并保持保存状态。
确保保存游戏(数据)的不同方法:
“自动保存”功能(预写日志):就像某些视频游戏会在特定检查点自动保存您的进度一样,数据库有一个系统,可以在完全更新所有内容之前记录更改。这是一个快速的自我提示,“记住保存此更改。”
游戏日记(Journaling):有些玩家会写日记或日记,记录他们在游戏中所做的事情。同样,数据库可能会将更改存储在单独的“日记”中,然后再将其永久化。
强制保存选项(数据文件同步):您是否曾经因为不信任自动保存而手动选择保存游戏?在数据库世界中,有一种方法可以强制系统在更改后立即保存任何新数据。
多个保存文件(复制):为您的游戏提供多个保存文件总是一个好主意。同样,数据库通常会跨不同位置创建数据副本。如果一个“保存文件”出现问题,还可以依靠其他文件。
云备份(备份和恢复):就像您可以在云上备份游戏进度一样,数据库也有一个定期在其他地方保存数据的系统。这样,如果出现问题,他们可以从之前的点“加载”并恢复游戏(数据)。
因此,简而言之,数据库世界中的持久性就是确保一旦取得进展(或更改),就不会丢失它。这是关于保存、重新保存以及为您的备份进行备份!
ACID 属性为数据库可靠性提供了支柱。从银行业务到社交媒体更新,这些原则确保我们的数据即使在系统故障的情况下也保持一致、可靠和值得信赖。通过理解这些概念,我们对现代数据库系统的稳健性和复杂性有了更深入的认识。文章来源:https://www.toymoban.com/diary/share/385.html
文章来源地址https://www.toymoban.com/diary/share/385.html
到此这篇关于SQL 中的 ACID 和事务的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!