看看 Pat 的
关于分布式系统的零散思考
pathelland.substack.com
几十年来,我一直认为事务性 ACID 中的 C 是最弱的属性。 这正好表明我当了 37 年的傻瓜。
维基百科在其关于一致性(数据库系统)的条目下,提供了对 ACID 中 C 的相当典型的解释
数据库系统中的一致性指的是任何给定的数据库事务都必须仅以允许的方式更改受影响的数据的要求。 写入数据库的任何数据都必须根据所有定义的规则有效,包括约束、级联、触发器以及它们的任何组合。
这并不能保证事务在应用程序员可能希望的所有方面都是正确的(那是应用程序级别代码的责任),而仅仅是保证任何编程错误都不会导致违反任何定义的数据库约束。
这种描述似乎不是很具体,所以我一直有点不屑一顾地认为一致性等同于原子性、隔离性和持久性。 总的来说,我认为维基百科描述的 C 特征实际上只是隔离性的重述。
最近我有机会与我的老朋友,ACID 的发明者 Andreas Reuter 聊天。 他和他的博士生导师 Theo Härder 在他们 1983 年著名的论文 面向事务的数据库恢复原则1 中创造了这个术语。
由于事务(理论和实践)自 1978 年以来一直是我最大的热情之一,我生动地记住了这篇论文的发表和 ACID 概念的创建。 当我在 1985 年有机会亲自见到 Andreas 时,我们成为了朋友。
最近,我一直在更多地思考一致性以及它在我们的许多计算机科学社区中的含义。 在我最近与 Andreas 聊天之前,我调出了介绍 C 概念的论文并再次阅读。 没有什么新的东西跳出来。
当 Andreas 和我聊起彼此的生活以及我们对技术的看法时,我问他在 ACID 测试中添加一致性时的意图。 这不只是老调重弹的隔离性吗? 他说,应用程序需要控制事务中包含的内容,以确保应用程序的规则是一致的。 C 的意思是应用程序决定更改集的完成。 因此,当应用程序写入更改集时,它可以强制执行约束、级联、触发器等等。 它还可以强制执行仅在该实例中才有意义的应用程序特定规则(例如,航空公司对常旅客的特殊待遇)。
我震惊了! 37 年来,我一直都错了! C 是 ACID 中强大、简单且重要的成员。 这个简单的附加规则——与原子性、隔离性和持久性并列——确实允许应用程序在更改数据库时强制执行更具凝聚力的语义。
多年来我看到的定义,正如前面引用的维基百科条目所代表的那样,通过关注实际规则的后果 而不是规则本身,将 C 置于更狭隘的视角。
但是,最初提出 ACID 的原始论文又如何呢? 我在与 Andreas 聊天前几分钟才读过它。 在我们的谈话之后(又一次)看着它,我清楚地看到了
一致性。 事务达到其正常结束(EOT,事务结束),从而提交其结果,从而保持数据库的一致性。 换句话说,每个成功的事务根据定义只提交合法的结果。 此条件是第四个属性(持久性)所必需的。
所以,即使在我向 Andreas 提问之前看到这个定义时,在近四十年来基于我的假设看待 C 之后,我仍然戴着有色眼镜。 直到 Andreas 如此直言不讳地说出来,我才理解它的简单性。
对我来说,一个重要的教训是努力始终质疑你的假设。 努力让自己周围都是好奇和充满激情的人,无论老少,他们会挑战你并试图消除你的有色眼镜。 营造一种让他们在这样做时感到安全的文化。
感谢我的老朋友 Andreas!
1. Härder, T., Reuter, A. 1983. 面向事务的数据库恢复原则。 计算调查 15(4); https://dl.acm.org/doi/10.1145/289.291.
Pat Helland 自 1978 年以来一直从事事务系统、数据库、应用程序平台、分布式系统、容错系统和消息传递系统的实施工作。 为了娱乐,他偶尔撰写技术论文。 他在 Salesforce 工作。 他的博客位于 pathelland.substack.com。 在 Twitter 上关注他 @pathelland。
版权所有 © 2021 归所有者/作者所有。 出版权已授权给 。
最初发表于 Queue 第 19 卷,第 2 期——
在 数字图书馆 中评论本文
Matt Godbolt - C++ 编译器中的优化
在向编译器提供更多信息方面需要权衡:它会使编译速度变慢。 链接时优化等技术可以为您提供两全其美的方案。 编译器中的优化不断改进,即将到来的间接调用和虚拟函数分派方面的改进可能很快就会带来更快的多态性。
Ulan Degenbaev, Michael Lippautz, Hannes Payer - 作为合资企业的垃圾回收
跨组件跟踪是解决跨组件边界的引用循环问题的一种方法。 只要组件可以形成跨 API 边界具有重要所有权的任意对象图,就会出现此问题。 CCT 的增量版本已在 V8 和 Blink 中实现,从而能够以安全的方式有效且高效地回收内存。
David Chisnall - C 不是一种低级语言
在最近的 Meltdown 和 Spectre 漏洞之后,值得花一些时间来研究根本原因。 这两个漏洞都涉及处理器推测性地执行超出某种访问检查的指令,并允许攻击者通过侧信道观察结果。 导致这些漏洞以及其他几个漏洞的功能被添加,是为了让 C 程序员继续相信他们正在用低级语言编程,而这种情况已经几十年没有发生过了。
Tobias Lauinger, Abdelberi Chaabane, Christo Wilson - 你不应该依赖我
大多数网站都使用 JavaScript 库,并且其中许多库已知是易受攻击的。 了解问题的范围以及包含库的许多意外方式,只是改进情况的第一步。 此处的目标是,本文中包含的信息将有助于为社区提供更好的工具、开发实践和教育工作。