其实标题有点不够准确,ETAG 从严格意义上讲并不是用来锁住一个资源,而是用来避免同一个资源同时被更新造成的彼此覆盖的问题(mid-air collisions)。

方法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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

SAP Fiori里两种锁机制(lock)的实现相关推荐

  1. JUC里面的相关分类|| java并发编程中,关于锁的实现方式有两种synchronized ,Lock || Lock——ReentrantLock||AQS(抽象队列同步器)

    JUC分类 java并发编程中,关于锁的实现方式有两种synchronized ,Lock AQS--AbstractQueuedSynchronizer

  2. ReentrantLock和synchronized两种锁定机制

    ReentrantLock和synchronized两种锁定机制 应用synchronized同步锁 把代码块声明为 synchronized,使得该代码具有 原子性(atomicity)和 可见性( ...

  3. 面试中的最常被问到的两种锁

    文章目录 面试中的最常被问到的两种锁 **锁的分类** **乐观锁** **悲观锁** 面试中的最常被问到的两种锁 公众号后台领取更多 面试必看资料 面试中经常被问到的锁到底是哪两种锁呢?接下来我们就 ...

  4. Spring AOP两种实现机制是什么?

    Spring AOP两种实现机制是什么? 1.如果是有接口声明的类进行AOP 时,spring调用的是java.lang.reflection.Proxy 类来做处理 2.如果是没有接口声明的类时, ...

  5. 做开发,这几种锁机制你不得不了解一下

    摘要:并发访问共享资源,如果不加锁,可能会导致数据不一致问题,通常为了解决并发访问问题,我们都会在访问共享资源之前加锁,保证同一时刻只有一个线程访问.下面我们用问答的方式说明下各种并发锁的概念.优缺点 ...

  6. Redis学习一:Redis两种持久化机制

    申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 Redis是基于内存来实现的NO SQL数据库,但是我么你都 ...

  7. 验证码(Captcha)的两种校对机制

    文章目录 前言 两种验证机制 状态验证码 无状态验证码 前言 Captcha,中文全称为全自动区分计算机和人类的图灵测试,在实际使用中常常以验证码的形式出现在人们的视野中,即通过展示一张图片,要求用户 ...

  8. 一文看懂 Bahdanau 和 Luong 两种 Attention 机制的区别

    来自 | 知乎  作者 | Flitter 链接 | https://zhuanlan.zhihu.com/p/129316415 编辑 | 深度学习这件小事公众号 本文仅作学术交流,如有侵权,请联系 ...

  9. Redis中两种持久化机制RDB和AOF

    redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Ap ...

最新文章

  1. C#版本的CPU性能测试
  2. 攻克指针(二)精华篇
  3. vue-router学习笔记(一)
  4. Windows 快速删除 大量文件
  5. 【topoSort拓扑排序】1424. 奖金(简单题目看拓扑排序)
  6. mysql两张表一起计数_mysql-同一张表上的多个联接,其中一个查询计数
  7. GIS创新实践【课堂笔记】
  8. 在consumer中调用provider服务
  9. DDD理论学习系列(11)-- 工厂
  10. 低配本用win10服务器系统,低配电脑装win10会怎么样
  11. 计算机1级b知识点,初中信息技术等级考试知识点
  12. 嵌入式系统多媒体框架分析
  13. 欢迎甲方跳槽到云厂商
  14. (附代码)基于Python对交通路口的红绿灯进行颜色检测
  15. 为什么叫区块链存储?兼谈IPFSFilecoin, Chia
  16. 我从实习到现在的经历,幸运女神总会来到!
  17. 聊聊3D建模行业的发展前景,这类建模师目前最吃香
  18. matlab包络分析函数,数据包络分析 (MATLAB代码).doc
  19. Alpha选股:资本资产定价模型(CAPM)
  20. 盗版不需要考虑,直接企业版(Enterprise)走起?

热门文章

  1. recyclerView + GridLayoutManager 实现任意网格布局+拖拽排序
  2. zookeeper安装及分布式配置
  3. 如何使用 jMeter Parallel Controller - 并行控制器以及一些常犯的错误
  4. Debug a Server–Side Rendered SAP Spartacus Storefront Using Chrome Dev Tools
  5. SAP Spartacus PageMetaService 的单元测试
  6. 作为一名 ABAP 资深顾问,下一步可以选择哪一门 SAP 技术作为主攻方向?
  7. Firefox开发者工具里的CSS Flexbox Inspector
  8. SAP CRM WebClient UI检查当前页面是否支持Delta handling的代码
  9. 如何使用SAP云平台的Notification服务给Android应用推送通知消息
  10. error when defining a rule - SAP loyalty management的积分定义规则