undo-log
定义
undo - log本质上是一种对数据变更前状态的记录。以数据库操作为例,当执行插入、更新或删除等操作时,undo - log会把操作之前数据的原始状态记录下来。比如,要更新某条订单记录的金额字段,undo - log就会记录更新前这条记录中金额字段的具体值 。
作用
- 支持事务回滚:在分布式事务中,当某个分支事务需要回滚时,undo - log可以提供数据恢复的依据。比如在一个涉及多个微服务数据库操作的分布式事务里,若其中一个服务的操作需要撤销,就可以依据undo - log将数据恢复到事务执行前的状态,确保数据的一致性。
- 保证数据一致性:在事务提交过程中,可能会遇到各种异常情况,如网络故障、服务器宕机等。undo - log能在这些异常发生时,帮助系统恢复到事务开始前的状态,避免数据处于不一致的中间状态,从而保证了分布式系统中数据的一致性 。
工作原理
- 记录阶段:在第一阶段RM(Resource Manager,资源管理器,如数据库)执行具体业务SQL之前,会先将数据变更前的状态记录到undo - log中。例如,执行
UPDATE orders SET amount = 1000 WHERE order_id = 1;
这条SQL语句,RM会先把order_id = 1
这条记录变更前的amount
值(假设是800)记录到undo - log中,然后再执行SQL更新操作并提交 。 - 回滚阶段:如果在事务的第二阶段需要回滚,RM会根据undo - log中记录的信息,反向执行操作来恢复数据。接着上面的例子,如果要回滚,RM会根据undo - log里记录的
amount
原始值800,执行类似UPDATE orders SET amount = 800 WHERE order_id = 1;
的操作,将数据恢复到更新前的状态。 - 提交阶段:当事务成功提交,意味着所有分支事务都正常执行完毕,此时undo - log就失去了作用,在第二阶段提交时RM会将其删除,以释放存储空间 。
与redo - log对比
redo - log是记录数据变更后的状态,主要用于在系统故障恢复时,将数据恢复到最新的提交状态,保证已提交事务的数据不会丢失。而undo - log是记录数据变更前的状态,用于事务回滚,两者在功能和用途上是互补的 。
应用场景举例
在电商的分布式订单系统中,一次下单操作可能涉及订单服务向订单库插入订单记录,同时库存服务从库存库中扣减相应商品库存。如果在扣减库存操作完成后,插入订单记录失败,此时就可以利用undo - log将库存数据回滚到扣减前的状态,保证整个分布式事务的一致性,避免出现有库存扣减但无订单记录的不合理情况 。