一张销售发票已经开出,财务凭证也已过账,过了几分钟,业务人员发现开票对象选错了。此时开发人员很容易想到ROLLBACK WORK,希望像点燃《仙剑奇侠传 1》里的还魂香一样,把已经发生的事拉回来。可在系统里执行这条语句,并不会让那张发票消失,也不会让财务凭证回到过账前。问题不在于 ABAP 的恢复能力弱,而在于事务尚未提交、业务已经提交、数据库需要恢复,是三种不同的处境。还魂香在游戏中的作用,是让倒下的角色复活,并恢复少量体力。按常见的《仙剑奇侠传》道具资料,其恢复量为体力的百分之十。拿它类比企业系统,重点不该放在「时间倒流」,而该放在「让一个失去继续运转能力的对象重新进入可用状态」。复活后只有少量体力这一点也很贴切,技术上恢复了记录或服务,不等于业务已完整恢复。订单能重新编辑,库存、支付、通知、审计记录却可能还需要逐项核对。因此,ABAP 里没有一件通用的还魂香。真正接近它的,是按故障所处阶段选择的几种机制。事务提交前,可以撤销本次变更。事务提交后,通常要走业务上的取消、冲销、重建或补偿。数据因故障丢失时,则要依靠备份和日志恢复。把这几种动作混为一谈,恰恰是生产事故里容易扩大损失的原因。在传统 SAP ABAP 应用中,ROLLBACK WORK是最容易被叫作还魂香的语句,但它的有效范围有明确边界。一个业务动作可能在同一个 SAP 逻辑工作单元,也就是SAP LUW中安排数据库修改、更新任务和其他待提交工作。只要工作单元尚未成功提交,程序发现条件不满足,就能终止这一轮工作。ROLLBACK WORK会结束当前工作单元并撤销相应的待提交变更。它处理的是正在进行的这一笔交易,并没有查找昨天的状态、重放历史