现代应用程序并非在真空中运行。每次预订行程、购买商品或更新余额时,后端都会跨不同的表或服务执行多项操作(读取、写入、验证)。这些操作要么同时成功,要么作为一个整体失败。
这就是交易介入的地方。
数据库事务将一系列操作包装成一个“全有或全无”的单元。要么全部提交并公开,要么全部不提交。换句话说,目标是避免出现未完成的订单、账户余额不一致以及虚假预订。
然而,当出现并发性时,保持正确性变得更加困难。
这是因为事务并非孤立运行。真实的系统会同时处理数十、数百甚至数千个用户。每个用户都希望自己的操作能够成功。在幕后,数据库必须平衡隔离性、性能和一致性,而不会导致系统瘫痪。
这种平衡并非易事。以下是一些案例:
-
一个事务可能会读取另一个事务即将更新的数据。
-
两个用户可能会尝试保留同一个库存槽。
-
后台作业可能会在客户点击“确认”之前锁定记录。
这种情况可能会导致冲突、竞争条件和死锁,从而完全停止系统。
在本文中,我们将分解事务系统在并发环境下保持可靠性的关键构建模块。我们将从基础知识入手:什么是事务,以及 ACID 属性的重要性。然后,我们将深入探讨并发控制机制(悲观和乐观),并理解与之相关的权衡。
什么是数据库事务?
原文: https://blog.bytebytego.com/p/a-guide-to-database-transactions