方法一:ETAG机制SAPCRMFiori采用的就是这种机制。下面看一个具体的例子来理解。假设我使用用户名Jerry选择了ID为3456的Opportunity,点击Edit按钮后:会触发读取操作并发送到后台:后台会响应读取请求,并在header字段中写入相应的值ETAG的响应。应用程序可以通过不同的逻辑计算出26AE末尾的ETAG的值,直接使用请求节点对应的上次更改时间戳(LastChangedTimestamp)。比如下面的ABAP代码,也可以根据数据的完整内容进行计算。HASH值作为ETAG返回给FioriUI:现在我用另一个用户修改同一个Opportunity,保存成功。然后回到用户Jerry的编辑窗口。此时,Jerry并不知道商机已被其他用户修改。Jerry修改了Opportunity的Name字段并单击Save按钮。收到此提示信息。从Chrome开发工具可以观察到,当Jerry点击保存按钮时,发送到后台的请求头中包含一个If-Match字段。该字段的值是Jerry第一次点击编辑按钮时后台返回的值。Jerry的26AE末尾的ETAG字段。请问幕后发生了什么?在框架的CHECK_BEFORE_MODIFICATION方法中,框架会将FioriUI请求传入的ETAG与当前最新的ETAG进行比较:CHECK_BEFORE_MODIFICATION会调用CHECK_ETAG_MATCH方法。如果检查失败,则不会执行当前的保存操作。方法二:基于BOPF的锁实现该方法用于S/4HANA的Fiori应用,如Material应用。此Fiori应用程序使用基于CDS视图和BOPF的OData服务。打开一个Material,点击Edit:此时在ABAP后台使用事务码SM12,观察到Material对应的数据库表被锁定:这是如何实现的?在S/4HANA后台使用事务码BOBX打开BO模型I_PRODUCTWD。展开模型,双击EDIT,可以看到Edit实现的类是CL_I_DR_PRODUCTWD。双击这个类,它的方法LOCK_ACTIVE_DOCUMENT就是响应FioriUI上编辑按钮点击的处理函数。我们在该方法中设置断点,然后点击UI上的编辑按钮,断点触发。可以从调用栈中清空,观察点击编辑按钮后程序执行流程是如何从BOPF框架下发到Material应用的锁链代码中的。这个加锁逻辑调用了传统的ABAPEnqueue功能模块。获取更多Jerry原创技术文章,请关注公众号“汪子熙”或扫描下方二维码:
