事务不是存储系统的固有部分。任何存储系统都可以实现事务化:Redis、S3、文件系统等。Delta Lake和Orleans演示了使 S3(或一般的云存储)实现事务化的技术。 Epoxy演示了使 Redis(以及任何其他系统)事务化的技术。当然,总是有好的旧两阶段提交。
如果您不想阅读这些论文,我写过有关 Delta Lake 的简化实现的文章,还写过有关通用键值存储层上的简化 MVCC 实现的文章。
事务并不是存储系统所固有的,这既是事务的优点,也是事务的负担。 Postgres 和 MySQL 以及 SQLite 都有事务。但你不需要使用它们。不可能要求您使用交易。许多开发人员,包括几年前的我自己,都不知道为什么应该使用它们。 (提示:阅读设计数据密集型应用程序。)
您还可以更进一步,忽略现有事务数据库的事务层并实现您自己的事务层,就像Convex 所做的那样(上面的 Epoxy 论文也这样做了)。目前尚不完全清楚的是,通过实现自己的事务层,您会损失很多,因为您想要在值的版本字段上建立的索引只会与事务数据库中的任何其他二级索引一样昂贵或缓慢。虽然你为什么这样做并不完全清楚(我想在某个时候从 Convex 上读到这一点)。
当您关心一致性、原子性和隔离性时,将事务协议视为系统设计工具箱中的另一个工具非常有用。特别是当您构建跨数据系统的系统时。也许,正如 Ben Hindman 在上一届NYC Systems中暗示的那样,即使是专有 API 最终也会提供类似两阶段提交的功能,因此我们无法控制的物理系统也可以变成事务性的。
交易是一种协议
简短的新帖子pic.twitter.com/nTj5LZUpUr
— Phil Eaton (@eatonphil) 2025 年 4 月 20 日
原文: http://notes.eatonphil.com/2025-04-20-transactions-are-a-protocol.html