关系型数据库通过 ACID 属性(原子性、一致性、隔离性、持久性)以及锁、隔离级别和预写日志等机制来确保事务一致性。事务——被视为单个单元的一组操作——必须要么完全完成,要么完全没有效果,即使在发生故障时也能保持数据完整性。例如,银行账户间的转账需要从一个账户扣款并向另一个账户入账。如果其中任何一个操作失败,事务将回滚,确保系统保持一致。数据库强制执行外键约束和唯一索引等规则,以防止无效数据,即使在事务提交之前也能确保逻辑一致性。
锁机制可以防止冲突的数据访问。当事务修改数据时,它会获得一个排他锁,阻止其他事务读取或写入相同数据,直到锁释放为止。对于读取,共享锁允许并发访问但阻止写入。例如,如果两个事务同时尝试更新同一账户余额,数据库会将第二个事务排队,直到第一个事务完成,从而避免不一致的中间状态。隔离级别(例如,读已提交、可串行化)控制锁的应用严格程度。可串行化等更高隔离级别可以防止脏读(读取未提交数据)等现象,但可能会降低并发性。开发者根据其应用程序对一致性与性能权衡的容忍度来选择合适的隔离级别。
预写日志(WAL)和恢复过程进一步确保一致性。在将任何数据更改写入磁盘之前,都会记录在事务日志中。如果发生崩溃,数据库在恢复期间使用此日志来重做未完成的事务或撤销失败的事务。例如,如果断电导致事务中断了一半,数据库会重放日志以将系统恢复到最后一次一致的状态。检查点会定期同步内存和磁盘数据,减少恢复时间。这些机制保证已提交的事务得以持久化,未提交的事务不留痕迹,从而在正常操作和故障场景中都保持一致性。