SAP Fiori里两种锁机制(lock)的实现
其实标题有点不够准确,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)的实现相关推荐
- JUC里面的相关分类|| java并发编程中,关于锁的实现方式有两种synchronized ,Lock || Lock——ReentrantLock||AQS(抽象队列同步器)
JUC分类 java并发编程中,关于锁的实现方式有两种synchronized ,Lock AQS--AbstractQueuedSynchronizer
- ReentrantLock和synchronized两种锁定机制
ReentrantLock和synchronized两种锁定机制 应用synchronized同步锁 把代码块声明为 synchronized,使得该代码具有 原子性(atomicity)和 可见性( ...
- 面试中的最常被问到的两种锁
文章目录 面试中的最常被问到的两种锁 **锁的分类** **乐观锁** **悲观锁** 面试中的最常被问到的两种锁 公众号后台领取更多 面试必看资料 面试中经常被问到的锁到底是哪两种锁呢?接下来我们就 ...
- Spring AOP两种实现机制是什么?
Spring AOP两种实现机制是什么? 1.如果是有接口声明的类进行AOP 时,spring调用的是java.lang.reflection.Proxy 类来做处理 2.如果是没有接口声明的类时, ...
- 做开发,这几种锁机制你不得不了解一下
摘要:并发访问共享资源,如果不加锁,可能会导致数据不一致问题,通常为了解决并发访问问题,我们都会在访问共享资源之前加锁,保证同一时刻只有一个线程访问.下面我们用问答的方式说明下各种并发锁的概念.优缺点 ...
- Redis学习一:Redis两种持久化机制
申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 Redis是基于内存来实现的NO SQL数据库,但是我么你都 ...
- 验证码(Captcha)的两种校对机制
文章目录 前言 两种验证机制 状态验证码 无状态验证码 前言 Captcha,中文全称为全自动区分计算机和人类的图灵测试,在实际使用中常常以验证码的形式出现在人们的视野中,即通过展示一张图片,要求用户 ...
- 一文看懂 Bahdanau 和 Luong 两种 Attention 机制的区别
来自 | 知乎 作者 | Flitter 链接 | https://zhuanlan.zhihu.com/p/129316415 编辑 | 深度学习这件小事公众号 本文仅作学术交流,如有侵权,请联系 ...
- Redis中两种持久化机制RDB和AOF
redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Ap ...
最新文章
- C#版本的CPU性能测试
- 攻克指针(二)精华篇
- vue-router学习笔记(一)
- Windows 快速删除 大量文件
- 【topoSort拓扑排序】1424. 奖金(简单题目看拓扑排序)
- mysql两张表一起计数_mysql-同一张表上的多个联接,其中一个查询计数
- GIS创新实践【课堂笔记】
- 在consumer中调用provider服务
- DDD理论学习系列(11)-- 工厂
- 低配本用win10服务器系统,低配电脑装win10会怎么样
- 计算机1级b知识点,初中信息技术等级考试知识点
- 嵌入式系统多媒体框架分析
- 欢迎甲方跳槽到云厂商
- (附代码)基于Python对交通路口的红绿灯进行颜色检测
- 为什么叫区块链存储?兼谈IPFSFilecoin, Chia
- 我从实习到现在的经历,幸运女神总会来到!
- 聊聊3D建模行业的发展前景,这类建模师目前最吃香
- matlab包络分析函数,数据包络分析 (MATLAB代码).doc
- Alpha选股:资本资产定价模型(CAPM)
- 盗版不需要考虑,直接企业版(Enterprise)走起?
热门文章
- recyclerView + GridLayoutManager 实现任意网格布局+拖拽排序
- zookeeper安装及分布式配置
- 如何使用 jMeter Parallel Controller - 并行控制器以及一些常犯的错误
- Debug a Server–Side Rendered SAP Spartacus Storefront Using Chrome Dev Tools
- SAP Spartacus PageMetaService 的单元测试
- 作为一名 ABAP 资深顾问,下一步可以选择哪一门 SAP 技术作为主攻方向?
- Firefox开发者工具里的CSS Flexbox Inspector
- SAP CRM WebClient UI检查当前页面是否支持Delta handling的代码
- 如何使用SAP云平台的Notification服务给Android应用推送通知消息
- error when defining a rule - SAP loyalty management的积分定义规则