一张销售订单正在被总部的业务人员修改,海外子公司的同事也打开了同一张订单。两边的界面都显示原来的交货日期,各自却准备写入不同的新日期。此时我们关心的不是程序能否执行UPDATE,而是谁有权修改、并发修改会不会互相覆盖、错误数据能否在保存前被拦住。这种场景很适合借《仙剑奇侠传 1》的金罡珠来理解 ABAP 的防护机制。
金罡珠是增加防御的佩戴物,常见的游戏资料记载其防御加成为 90 点。它的特点在于佩戴后持续提高防御,而不是受到攻击时临时使用一次,也不是直接恢复已经损失的体力。映射到企业系统,最接近的不是某一条神奇的 ABAP 语句,而是附着在业务对象上的一组持续生效的保护规则。它们在读取、修改、保存这些关键时刻发挥作用,使不合规操作更难伤到核心数据。
这里必须给类比画一条边界。游戏的防御数值能够归到一个角色身上,企业系统里的风险却有不同来路。未授权修改、两个人互相覆盖、无效数据入库、事务只成功一半,各自需要不同机制处理。给订单加了一把锁,并不能代替权限检查。做了权限检查,也不能保证另一位有权限的同事不会同时提交修改。真正像金罡珠的,是围绕一张订单配置并落实的整套防护,而不是把某个技术名词当作万能护符。
在传统的 SAP ABAP On-Premise 开发里,我通常会从锁对象谈起。假定两位同事都要修改订单4711,业务规则要求同一时刻只能有一个人进入该订单的关键修改流程。我们可以在 ABAP Dictionary 中定义以订单键为范围的锁对象。激活后,系统生成相应的ENQUEUE和DEQUEUE函数模块。程序在修改前申请锁,申请失败就告知当前操作人订单正在被处理,成功取得锁的程序则在事务结束时按设计释放它。