方法1: ETAG机制

SAP CRM Fiori采用了这种机制。

看一个具体的例子来理解。假设我用用户名Jerry选中了这个ID为3456的Opportunity,点击Edit按钮之后:

会触发一个读操作发到后台:

后台响应这个读请求,并且在响应的头部字段ETAG里写入了对应的值。

这个26AE结尾的ETAG的值可以由应用程序采取不同的逻辑计算,可以直接采用请求节点对应的最后修改时间戳(Last Changed Timestamp), 例如下面这段ABAP代码:

也可以基于数据的完整内容计算一个HASH值出来作为ETAG返回给Fiori UI:

现在我用另一个用户,对同一个Opportunity做了修改,成功保存。然后再回到用户Jerry的这个编辑窗口,此时Jerry根本不知道该Opportunity已经被另一个用户修改了。Jerry修改了Opportunity的Name字段,点击保存按钮。

收到这个提示信息。

从Chrome Development Tool里能观察到,当Jerry点击了保存按钮后,发送到后台的请求的头部包含了一个If-Match字段,这个字段的值就是Jerry第一次点击编辑按钮时,后台返回给Jerry的26AE结尾的ETAG字段。

背后发生了什么事请呢?在框架的方法CHECK_BEFORE_MODIFICATION里,框架会把Fiori UI请求传进来的ETAG和当前最新的ETAG做比较:

CHECK_BEFORE_MODIFICATION又会调用CHECK_ETAG_MATCH方法。如果check失败,当前的保存操作将不会执行。

方法2: 基于BOPF的锁实现

这种方式用于S/4HANA的Fiori应用,比如Material application。这种Fiori应用,消费的OData service是基于CDS view 加上BOPF实现的。

打开一个Material,点击Edit:

此时到ABAP后台使用事务码SM12能观察到Material对应的数据库表被锁住了:

这是怎么实现的呢?

在S/4HANA后台使用事务码BOBX打开BO模型I_PRODUCTWD. 展开模型,双击EDIT,能看到这个Edit实现的类为CL_I_DR_PRODUCTWD.

双击这个class,它的方法LOCK_ACTIVE_DOCUMENT就是响应Fiori UI上编辑按钮点击的处理函数。

我们在这个方法里设置断点,然后在UI上点击编辑按钮,断点触发。从调用栈即可清除观察到编辑按钮点击之后,程序执行流是如何从BOPF框架投递到Material应用的枷锁代码。这个加锁逻辑调用的是传统的ABAP Enqueue function module。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

最新文章

  1. Node.js:DNS模块的使用
  2. 给jquery-validation插件添加控件的验证回调方法
  3. JavaScript学习笔记4之 ByClass&json
  4. xpath实例 --//span[contains(.,'资讯管理')]
  5. 了解HTML表单之input元素的23种type类型
  6. Application中的路径
  7. ${pageContext.request.contextPath} JSP取得绝对路径
  8. 【安卓面试题】简述一下Android系统的架构?
  9. linux 常用命令基础
  10. 我对WindowsPhone8的一些反大众看法.
  11. Cocos2DX新手入门笔记索引
  12. C语言初学 计算二元一次方程的问题
  13. datatable赋值行
  14. iOS开发之Xib和storyboard对比
  15. 将你的Python Web程序部署到Ubuntu服务器上
  16. android采用SurfaceView实现文字滚动效果
  17. History of program (language).
  18. Python并发编程之消息队列补充及如何创建线程池(六)
  19. POJChallengeRound2 Guideposts 【单位根反演】【快速幂】
  20. 如何在xlwt中编写多个列的单元格?

热门文章

  1. once函数,简约不简单的
  2. rewrite 功能
  3. 97 条 Linux 运维工程师常用命令总结[转]
  4. Oracle 基础系列之1.2 oracle的基本使用
  5. 安装cloudermanager时出现org.spingframework.web.bind.***** host[] is not present at AnnotationMethodHandlerAdapter.java line 738 ****错误(图文详解)(博主推荐)
  6. Shell脚本检测程序,如果挂了就重启程序
  7. flask表单flask-wtf
  8. goto语句和标签
  9. vs2013项目停止调试后 iis express也跟着退出
  10. 图片的URL上传至阿里云OSS操作(微信小程序二维码返回的二进制上传到OSS)