无事务
2007年3月18日
几年前,我和几个朋友在 eBay 工作,他们做了一些工作。听取人们在高流量网站上使用的技术总是很有趣,但也许最有趣的一点是 eBay 几乎从不使用数据库事务。
对于大多数人来说,进入无事务环境会让人很震惊。使用事务是数据库工作中非常普遍的一部分。包括我在内的许多人将事务视为数据库提供的关键优势之一。
不使用事务的理由是,它们会损害 eBay 处理的规模级别的性能。由于 eBay 将其数据大量地划分为许多物理数据库,因此这种影响会加剧。因此,使用事务将意味着使用分布式事务,而这通常是需要谨慎对待的。
这种大量的分区以及数据库在性能问题中的核心作用意味着 eBay 不会使用许多其他数据库功能。引用完整性和排序是在应用程序代码中完成的。几乎没有触发器或存储过程。
我对无事务的直接后续问题是询问这对应用程序程序员有什么影响,特别是对无事务的总体感觉。回答是,一开始很奇怪,但最终并没有什么大不了的——比你想象的要小得多。你必须注意提交的顺序,先提交更重要的提交。在每次提交时,你必须检查它是否成功,并决定如果失败该怎么办。
这种编程风格引起了我的兴趣,但由于我被告知要低调处理,所以我不会更广泛地谈论它。我现在可以谈论它了,因为 Dan Pritchett 在本周的 QCon 上发表了一个关于 eBay 架构的精彩 演讲,包括这方面的内容。(他还在 采访中谈到了这一点,还有一个有用的 pdf 信息库。)
我想了解更多关于以这种方式进行无事务编程的细节。除了始终值得考虑替代方案之外,无事务也比许多人想象的更常见。拥有多个资源的多步骤业务流程很常见,这些资源要么需要长时间运行的分布式事务,要么是根本不支持事务的资源。
我们不应该对此过度解读。没有人争论说我们应该从工具箱中删除事务。我对 eBay 的细节了解不够,无法判断即使对他们来说,避免事务是否是正确的方法。但 eBay 的例子表明,没有事务的生活远没有人们想象的那么不可能。