SQL 中的 ACID 和事务

关系数据库依靠某些属性来确保数据的可靠性和可信度。这些属性用首字母缩略词 ACID 来概括,分别代表原子性、一致性、隔离性和持久性。在本博客中,我们将使用现实生活中的场景和示例深入研究这些属性。

原子性:全部或无

原子性确保事务被视为单个单元,该单元要么完全完成,要么完全中止。

示例:考虑一个场景,您将 100 美元从用户 A 转账给用户 B:

  • 初始状态:

    • 用户A:1000美元

    • 用户B:500美元

如果在传输过程中,数据库在从用户 A 扣除 100 美元之后但在将其添加到用户 B 之前崩溃,则原子性可确保事务回滚到原始状态:

  • 回滚状态:

    • 用户A:1000美元

    • 用户B:500美元

隔离:保护您的交易不受彼此影响

数据库中术语“隔离”的核心是保护的概念。将每笔交易想象成一个小泡沫。隔离可确保这些气泡不会破裂或相互混合。通过这样做,它可以保证我们的数据安全无害。

揭开阅读现象:

当我们谈论“读取现象”时,我们讨论的是事务重叠时可能发生的意外情况。让我们逐一看看:

  • 脏读:想象一下有人正在打扫房间时偷看房间。一切都散了,一片狼藉。类似地,脏读就像查看另一个事务仍在更改的数据。由于这种变化可能会逆转,因此您所看到的内容可能不会持续存在。

  • 不可重复读取:想象一下您记下篮子里苹果的数量。一分钟后,你再次数数,但数字发生了变化,因为有人拿走了或添加了一个苹果。这就是这里发生的事情;您在事务开始时读取的数据可能会在事务完成时发生变化。

  • 幻读:这就像检查一篮子里有苹果,然后在下一次检查中发现橘子。真是出乎意料啊!当事务期间出现新数据(如那些神秘的橙子)时,就会发生幻读。

  • 丢失的更新:想象一下两位艺术家在同一张画布上绘画。如果他们在彼此的作品上作画,他们的贡献之一可能会消失。同样,当两个事务尝试更改同一数据时,其中一个更改可能会被忽略。

隔离级别 - 设置边界:

不同的隔离级别决定了我们保护交易泡沫的严格程度:

  • 未提交的阅读:这就像一个门开着的房间。你可以看到里面发生的一切,无论它是否完成。您可以看到其他事务正在进行的(未提交的)更改和已完成的(已提交的)更改。

  • 已读承诺:现在,门已微闭。只有当事情完成并解决后你才能看到它们。此级别允许您仅查看其他事务中已完成的更改。

  • 可重复阅读:想象一下,数一下篮子里的苹果,然后在篮子周围放一个防护罩,这样就没有人可以改变计数。在此级别下,您读取的任何数据在整个交易过程中都保持一致。

  • 快照:这就像给房间拍一张照片。即使内部情况发生变化,您也会始终查看照片,保持一致。从交易开始,您就会看到数据的“冻结”视图。

  • 可序列化:想象一座狭窄的桥,一次只能一个人通过。交易排队等候,确保它们不会相互干扰。

隔离级别比较:

隔离级别比较

一致性:将其想象为事实检查器

在数据库的世界里,“一致性”就像有一个细致的事实检查员,确保一切都匹配并且没有矛盾。它确保数据库中的每条信息都是可靠且值得信赖的。

用一个简单的类比来理解数据一致性:

想象一下您正在翻阅一本相册。每张照片下方都有一个数字,表示该照片在社交媒体平台上被点赞的次数。

现在,除了这张相册之外,您还有一本日记,记录了谁喜欢了哪张照片。如果相册中的一张照片有 5 个赞,那么您的日记中应该有 5 条喜欢该照片的人的条目。如果专辑说有5个赞,但日记里只列出了3个名字,那就没有意义了,对吧?这就是我们所说的数据一致性——确保数据库中不同位置的相关数据匹配。

简单来说数据一致性:

  • 相册(表一):猫的照片 - 5 赞

  • 日记(表2):爱丽丝喜欢这张猫的照片。鲍勃喜欢这张猫的照片。卡拉喜欢这张猫的照片。大卫喜欢这张猫的照片。艾玛喜欢这张猫的照片。

如果相册和日记之间存在任何不匹配,我们值得信赖的事实检查员(一致性)会指出并说:“嘿,这里有些不对劲!”

了解书籍示例的阅读一致性:

现在,假设您已经写了一本书并且拥有主副本(主要)。为了让更多人阅读它,您创建了这本书的副本(副本)。

如果您对主副本进行更改(例如编辑段落),副本也应反映该更改。如果有人在您进行编辑后立即拿起副本进行阅读,那么他们最好会看到最新版本。如果不是立即,那么不久之后。这确保了无论某人正在阅读主书还是其中一本副本,他们都能获得一致的信息。

用数据库术语来说,即使有一点点延迟(因为在任何地方进行更改都需要一点时间),我们也应该达到更新每个副本的程度。这称为“最终一致性”。

耐用性:将其视为保存游戏进度

在数据库世界中,持久性就像保存电子游戏中的进度一样。想象一下,您正在玩一个具有挑战性的关卡,经过数小时的努力,您终于征服了它。您不想冒失去进度的风险,对吗?您需要保存游戏,以确保即使发生断电或游戏机重新启动,您也不必再次玩该关卡。这正是持久性对数据库所做的事情;它确保一旦进行更改,无论发生什么情况,都会保存并保持保存状态。

确保保存游戏(数据)的不同方法:

  1. “自动保存”功能(预写日志):就像某些视频游戏会在特定检查点自动保存您的进度一样,数据库有一个系统,可以在完全更新所有内容之前记录更改。这是一个快速的自我提示,“记住保存此更改。”

  2. 游戏日记(Journaling):有些玩家会写日记或日记,记录他们在游戏中所做的事情。同样,数据库可能会将更改存储在单独的“日记”中,然后再将其永久化。

  3. 强制保存选项(数据文件同步):您是否曾经因为不信任自动保存而手动选择保存游戏?在数据库世界中,有一种方法可以强制系统在更改后立即保存任何新数据。

  4. 多个保存文件(复制):为您的游戏提供多个保存文件总是一个好主意。同样,数据库通常会跨不同位置创建数据副本。如果一个“保存文件”出现问题,还可以依靠其他文件。

  5. 云备份(备份和恢复):就像您可以在云上备份游戏进度一样,数据库也有一个定期在其他地方保存数据的系统。这样,如果出现问题,他们可以从之前的点“加载”并恢复游戏(数据)。

因此,简而言之,数据库世界中的持久性就是确保一旦取得进展(或更改),就不会丢失它。这是关于保存、重新保存以及为您的备份进行备份!

ACID 属性为数据库可靠性提供了支柱。从银行业务到社交媒体更新,这些原则确保我们的数据即使在系统故障的情况下也保持一致、可靠和值得信赖。通过理解这些概念,我们对现代数据库系统的稳健性和复杂性有了更深入的认识。


文章来源地址https://www.toymoban.com/diary/share/385.html

到此这篇关于SQL 中的 ACID 和事务的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/share/385.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
上一篇 2023年10月13日 01:46
下一篇 2023年10月13日 02:01

相关文章

  • 【建议收藏】数据库 SQL 入门——事务(内附演示)

    🙋‍♂️作者简介:生鱼同学,大数据科学与技术专业硕士在读👨‍🎓,曾获得华为杯数学建模国家二等奖🏆,MathorCup 数学建模竞赛国家二等奖🏅,亚太数学建模国家二等奖🏅。 ✍️研究方向:复杂网络科学 🏆兴趣方向:利用python进行数据分析与机器学习,数学建模竞

    2023年04月23日
    浏览(41)
  • Sql Server 数据库事务与锁,同一事务更新又查询锁?期望大家来解惑

    我有一个People表,有三行数据: 如果我们没详细了解数据库事务执行加锁的过程中,会不会有这样一个疑问:如下的这段 SQL 开启了事务,并且在事务中进行了更新和查询操作。 我们知道sql server数据库的默认事务级别是READ COMMITTED(已提交的读取),我们再看一下已提交读事

    2024年02月01日
    浏览(56)
  • 什么是T-SQL编程?T-SQL是Transact-SQL的缩写,是一种扩展了SQL(结构化查询语言)的编程语言,用于Microsoft SQL Server数据库管理系统中的数据管理和操作。T-

    什么是T-SQL编程? T-SQL是Transact-SQL的缩写,是一种 扩展了SQL(结构化查询语言) 的编程语言,用于Microsoft SQL Server数据库管理系统中的数据管理和操作。T-SQL支持创建 存储过程、触发器、函数 等高级特性,能够更加灵活地进行数据操作和处理。基本的T-SQL语法与标准SQL很相

    2024年01月21日
    浏览(97)
  • Sql Server 数据库事务与锁,同一事务更新又查询锁的变化,期望大家来解惑!

    我有一个People表,有三行数据: 如果我们没详细了解数据库事务执行加锁的过程中,会不会有这样一个疑问:如下的这段 SQL 开启了事务,并且在事务中进行了更新和查询操作。 我们知道sql server数据库的默认事务级别是READ COMMITTED(已提交的读取),我们再看一下已提交读事

    2024年02月01日
    浏览(73)
  • 【SQL Server】数据库开发指南(八)高级数据处理技术 MS-SQL 事务、异常和游标的深入研究

    本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中。 本系列文章列表如下: 【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作 【SQL Server】数据库开发指南(一)数据库设计的核心概念和基本步骤 【SQL Server】数据库开发指南(二)MSSQL数据库开发对

    2024年02月07日
    浏览(92)
  • 数据库编程大赛:一条SQL计算扑克牌24点

    你是否在寻找一个平台,能让你展示你的SQL技能,与同行们一较高下?你是否渴望在实战中提升你的SQL水平,开阔你的技术视野?如果你对这些都感兴趣,那么本次由NineData主办的《数据库编程大赛》,将是你的最佳选择! 本次数据库编程大赛的奖项安排:一等奖(1人)、二

    2024年02月03日
    浏览(44)
  • 数据库优化:探索 SQL 中的索引

    推荐:使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 在一本书中搜索特定主题时,我们将首先访问索引页面(该页面位于该书的开头),并找到包含我们感兴趣的主题的页码。现在,想象一下在没有索引页的书中找到特定主题是多么不方便。为此,我们必须搜索书中

    2024年02月14日
    浏览(70)
  • 【数据库】sql server 中的sql语句--增删改查

    上面是要建立的数据库 下面是sql语句:  

    2024年02月05日
    浏览(53)
  • 数据库中的SQL是如何执行的?

    参考文献:03丨学会用数据库的方式思考SQL是如何执行的 以oracle和MySQL为例,讲解了sql是怎么被执行的,并且对比了执行过程中,oracle和MySQL的异同。 个人感觉,讲解的核心是SQL执行时的缓存机制。 自我口述一下 sql语句在提交后, 首先进行“语法检查”,检查sql语法是否正

    2024年02月09日
    浏览(49)
  • 【SQL Server】数据库开发指南(三)面向数据分析的 T-SQL 编程技巧与实践

    本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中。 本系列文章列表如下: 【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作 【SQL Server】数据库开发指南(一)数据库设计的核心概念和基本步骤 【SQL Server】数据库开发指南(二)MSSQL数据库开发对

    2023年04月12日
    浏览(109)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包