用 Draft 把锁从会话里解放出来,SAP Fiori 无状态应用里的长事务方案
最近做 SAP Fiori Elements 应用时,最容易被低估的一类问题,不是页面怎么画,也不是按钮怎么放,而是编辑业务对象时,锁到底该跟着谁走。传统 ABAP 应用里,一个事务码打开、修改、保存,用户和后端会话之间有比较稳定的上下文关系,enqueue lock 的生命周期很好理解。可是到了 SAP Fiori、OData、移动端、浏览器多标签页这些场景里,事情一下子变复杂了。一次点击就是一次 OData request,一次 request 可能就是一个新的 ABAP session。前端看起来像是在连续编辑同一张单据,后端却未必还记得上一轮请求里的运行时状态。SAP 官方文档里把 durable lock 描述为一种通过 enqueue context 请求的锁,context 用来标识一段跨 session 的锁阶段;RAP 的 draft 文档也说明,EDIT action 会把 active instance 自动复制到 draft table,并维护锁直到 draft 被激活或锁过期。(SAP Help Portal) RAP 的 draft 机制还支持把业务数据中途停下来,哪怕数据暂时不一致,也可以以后继续处理。(