SAP锁机制(SAP Locks)经验小结

1. 数据一致性与锁

为什么要有锁机制?其背后的核心逻辑在于“保证数据的一致性”。

当数据被应用程序修改时,我们必须要保证修改后的数据具有一致性。在SAP系统中,将一致的数据状态从一个状态变动到另一个一致状态的时间跨度被称为LUW(逻辑工作单元)。

如果在LUW中发生了错误,系统将会自动撤销所有的操作,并将数据的状态回滚到初始的状态。这也就是rollback。

在SAP系统中,有两种类型的LUW,也即DB LUW和SAP LUW。

  • DB LUWs是通过database系统实现的
  • SAP LUWs是通过过特殊的SAP编程技术实现的

相应的,对应两种不同的LUW, SAP 设计了两种不同类型的锁。

  • DB Lock - 数据库系统设定加锁
  • SAP Lock - 在ABAP程序中加锁

在本文中,我将结合实际的开发经验,回顾和总结SAP Lock这个技术点。

2. SAP Locks基础概念

2.1 锁服务器

理论上讲,SAP Locks应当与SAP LUW的生命周期保持一致。

因为SAP系统可以有若干个应用服务器,为了应对不同应用服务器发送的数据请求,必须要有一个独立于应用服务器外的一个application server来处理锁的生命周期,我们通常将这个server称之为锁服务器(lock server)。

2.2 锁对象

SAP Locks的实现是基于lock object这个物理实体。通过SE11我们可以完成对于锁对象的定义。

通过锁对象,我们可以实现对于一行或多行数据的锁定,可以实现对多个数据表中数据的同时锁定(通过在定义锁对象时的外键依赖foreign key dependencies)。

当SE11定义完锁对象时,系统对自动生成一对锁函数,用于加锁和解锁。

下图展示了一个示例的锁对象:ZEGG_DOC_KEY。

有关锁对象的几点经验:

1. 锁对象中的主表,可以是一个实际上的DB表,也可以是一个结构。也就是说,SAP Lock其实是一种逻辑锁,有可能你锁定的表条目在DATABASE上根本就不存在。

2. SAP系统在应用服务器层面有一个全局的LOCK TABLE (SM12查看),用来管理逻辑锁来锁定相关的表条目,这个LOCK TABLE是cross-client的。如果,你的锁对象中,不包含MANDT这种client字段,加锁时,会对所有client上的这条数据进行锁定。

3. 如果primary table对应的structure上含有MANDT字段,在生成锁对象时,其对应的加锁函数上,会默认使用SY-MANDT值作为初始值。

4. SAP Lock支持缺省锁定,若只提供了了部分lock key,则会对缺省的key值全部锁定。举例,若lock key为 BURKS, BELNR 和GJAHR,加锁时,仅提供了 BUKRS = '1000' 其余值缺省,此时则会锁定所有 BUKRS = '1000'  的条目。同理,若加锁时,未提供任何一个lock paramter,则会锁定整个锁对象对应表。

2.3 加锁

加锁时,加锁函数会访问锁服务器的lock table,通过向lock table中写入相应条目来完成上锁动作。如果lock table中已经存在相应的锁条目而无法完成锁定,则会报出异常FOREIGN_LOCK。

下面是一个sample的加锁函数。

在使用加锁函数时,除了key字段外,还要关注几个技术参数。

2.3.1 mode_dbtab

mode_dbtab控制加锁的模式,基础模式有三种,也即E,X,S。

  • 模式E:当更改数据的时候设置为此模式。WriteLock(exclusive lock)
  • 模式X:和E类似,但是不允许累加,完全独占。Enhancedwrite lock (exclusive lock without cumulating)
  • 模式S:本身不需要更改数据,但是希望显示的数据不被别人更改。Read Lock(Shared Locked)

三种模式之间的依赖关系如下:

是否允许第二次加锁模式(同一进程内)
第一次加锁模式SEX
S允许允许不允许
E允许允许不允许
X不允许

在同一进程内,在加了S锁或E锁后,仍然可以继续加S锁或E锁。

是否允许第二次加锁模式(不同进程之间)
第一次加锁模式SEX
S允许 不允许不允许
E不允许
X不允许

在不同进程之间,在加了S后,仅可以继续加S锁。

S锁与E锁的经验小结:在仅读取数据时,加S锁,这样保证其它session中,仍然可加S锁读取数据时;在修改数据时,加E锁,这样保证修改数据时,对于数据的唯一锁定。

2.3.2 _scope

_scope参数定义了锁持续的时间,也即加锁后,何时会自动解锁。下面,我们引用SAP官方文档中的一张图,来进一步解释下这个概念。

在开始一个SAP LUW时,系统会创建两个Lock Owner(dialog owner和update owner),_scope参数用于说明这个lock归属于那个lock owner来控制。

含义
_scope = 1锁定仅属于对话所有者(dialog owner),因此仅存在于对话事务中。当调用DEQUEUE函数或事务结束时会解锁,COMMIT WORK或ROLLBACK WORK,并不会让锁失效。
_scope = 2

锁只属于更新所有者(update owner),当在更新任务CALL FUNCTION '...' IN UPDATE TASK和COMMIT WORK时,锁会被继承至此任务中。当更新事务完成时,锁会被释放。

可以使用ROLLBACK WORK,在锁被传递到更新之前释放锁。

注意:仅当调用了CALL FUNCTION '...' IN UPDATE TASK并结合COMMIT WORK时,锁才会被自动释放。仅使用COMMIT WORK并不会释放锁。

经验小结:对于_scope = 2的锁,若在程序中未调用CALL FUNCTION '...' IN UPDATE TASK任务,锁是不会自动释放的,需要手动释放锁;或创建一个dummy的IN UPDATE TASK任务,结合commit work一起使用。 例如下面的示例代码:

" ensure the locks are removed after update task

CALL FUNCTION 'ZGG_UPDATE_DUMMY' IN UPDATE TASK. 


COMMIT WORK AND WAIT.

_scope = 3该锁属于两位所有者( dialog owner 和 update owner)。换句话说,它结合了两者的行为。这个锁在两位所有者中的最后一个释放它后被取消。

2.3.3 _wait 和 _collect

_wait 和 _collect 参数一般使用的较少,其含义如下:

  • _wait :表示如果对象已经被锁定,是否等待后再尝试加锁,最大的等待时间由系统参数 ENQUE/DELAY_MAX控制。
  • _COLLECT:表示是否收集后进行统一提交。COLLECT 是一种缓存与批处理方法,即如果指定了Collect,加锁信息会放到Lock Container 中,Lock Container实际上是一个funciton Group控制的内存区域,如果程序中加了很多锁,锁信息会先放到内存中,这样可以减少对SAP锁管理系统访问。若使Lock Container中的锁生效,需执行FLUSH_ENQUEUE 这个Funciton,将锁信息更新到锁管理系统中,此时加锁操作生效,使用函数RESET_ENQUEUE可以清除Lock Container中的锁信息。

2.4 解锁

SAP锁可以通过删除锁表中的相关条目来手动释放(SM12)。

使用函数模块ENQUEUE设置SAP锁定时,传递给输入参数_SCOPE的值决定了锁定的持续时间。根据形式参数_SCOPE的值,SAP锁定可以如下释放:

加锁值锁的释放方式
_scope = 1

通过调用DEQUEUE函数释放;或等到对话程序结束时自动释放(包含的场景例如:程序自动结束、发生TYPE为A或者X的message、使用语句LEAVE PROGRAM,LEAVE TO TRANSACTION,或者在命令行输入/n回车以后)。

_scope = 2

在COMMIT WORK前通过DEQUEUE函数释放(但这没什么业务意义,因为_scope  = 2时,我们一定是希望锁持续至COMMIT WORK触发的更新任务执行完成。唯一有效的场景是,在加完_scope  = 2的锁后(COMMIT WORK执行前),程序发生了异常,此时捕获异常后,在CATCH分支需要DEQUEUE手动解锁,否则这个锁会在程序结束后,继续存在)。

通过IN UPDATE TASK任务结合commit work一起使用,在COMMIT WORK执行结束后,自动解锁。

_scope = 3

更新函数和对话程序都必须释放锁:

  • 更新释放锁对应于_SCOPE = 2
  • 对话程序中释放锁对应于_SCOPE = 1

最终锁释放由最后释放锁的动作决定。

注意:如果要使用函数模块 DEQUEUE 来在更新之外释放 SAP 锁定,那么形式参数 _SCOPE 必须被赋予一个大于或等于与函数模块 ENQUEUE 的同一形式参数传入的值。

下图是一个默认生成的dequeue函数,可以看到,dequeue时,其默认的scope是3。

2.5 上锁的一般步骤

先上锁,上锁成功之后,从数据库取数据,然后更改数据,接着更新到数据库,最后解锁。按照这个步骤,才能保证更改完全运行在锁的保护机制下。

3. 小结

本文总结了SAP Lock的工作原理,并分享了实际使用中的经验。希望本文对你有帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/18802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应对意外断电:气膜建筑的安全防护与智能管理—轻空间

气膜建筑以其独特的结构和高效的建设方式,广泛应用于各类场馆、仓储设施和临时展馆。然而,当遇到意外断电导致气膜内部无法送风时,如何避免气膜倒塌,确保建筑安全呢? 断电应急响应 气膜建筑配备了先进的智能控制系统&a…

记录一次Redisson使用synchronized和分布式锁不生效的原因

最近在开发的过程中,遇到了一个并发场景,用户进行方案复制的时候,当快速点击两次操作的时候,出现了复制方案重名的情况,实际上是复制方案的方案名称,是由后端根据数据库已有的方案名称和当前要复制的方案名…

git新电脑下载配置记录

1、官网下载 2、安装 3、配置 (1)先生成密钥 ssh-keygen -t rsa -C “XXXqq.com” (2)生成两个文件,复制.pub,在GitHub的setting里面设置ssh, (3)验证远程是否配置成功 ssh -T g…

Python轻量级的插件框架库之pluginbase使用详解

概要 在软件开发中,插件系统是一个常见的需求。插件系统允许开发者动态加载和卸载功能模块,从而提高应用程序的灵活性和可扩展性。Python的pluginbase库是一个轻量级的插件框架,旨在简化插件系统的构建过程。pluginbase库提供了一套简单易用的API,使开发者能够快速集成插件…

【408真题】2009-23

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

Windows电脑高颜值桌面便利贴,便签怎么设置

在这个看颜值的时代,我们不仅在衣着打扮上追求时尚与美观,就连电脑桌面也不愿放过。一张唯美的壁纸,几款别致的小工具,总能让我们的工作空间焕发出不一样的光彩。如果你也热衷于打造高颜值的电脑桌面,那么,…

探索智能零售的未来商机与运营策略

探索智能零售的未来商机与运营策略 在智能零售的广阔图景中,无人售货机加盟赫然矗立为一股不可小觑的力量,预示着零售业态未来的转型与机遇。其核心优势多维展开,具体阐述如下: 1. **全天候服务**:无人售货机的运行跨…

优思学院:什么是DMADV模式?和DMAIC有何区别?

在现代企业管理中,质量管理是一项至关重要的工作。六西格玛管理法作为一种高效的质量管理方法,已在全球范围内得到了广泛应用。它不仅在制造业中发挥了巨大的作用,在服务业和其他行业中也同样表现出了强大的生命力。六西格玛管理法主要有两种…

【30天精通Prometheus:一站式监控实战指南】第10天:blackbox_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们👋   欢迎加入【30天精通Prometheus】专栏!📚 在这里,我们将探索Prometheus的强大功能,并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。🚀   Prometheus是云原生和DevOps的…

Java——执行流程

一、执行流程 1、示例 //第一个Java程序 public class Hello{public static void main(String[] args){System.out.println("Hello World!");} } 编译: 执行: 我们可以看到这里的是类名,而不是字节码文件名 Hello.class &#…

通过 coze 快速构建自己的智能体机器人

通过 coze 快速构建自己的智能体机器人 coze 的使用 一)coze 是什么 「Coze 扣子」AI Bot 开发平台。任何用户都可以快速、低门槛地搭建自己的 Chatbot,且平台支持用户将其一键发布到飞书、微信公众号、豆包等渠道。 二)coze 怎么注册 1. …

【网络层】ICMP 因特网控制协议

文章目录 ICMP 含义以及作用ICMP协议解析结合ICMP协议和ping常见问题 ICMP 含义以及作用 ICMP:Internet control massage protocol 因特网控制协议 Internet控制报文协议ICMP是网络层的一个重要协议。 ICMP协议用来在网络设备间传递各种差错和控制信息,…

QT6.2.4 MSVC2019 连接MySql5.7数据库,无驱动问题

1.下载 查询一下数据库驱动 qDebug()<<QSqlDatabase::drivers(); 结果显示&#xff0c;没有QMYSQL的驱动。 QList("QSQLITE", "QMARIADB", "QODBC", "QPSQL") MySql6.2.4驱动下载地址&#xff0c;如果是别的版本&#xff0c;…

用易查分制作研学活动报名,支持在线签名,一键导出报名统计表格!

学校组织研学活动时&#xff0c;需要家长扫码在线填写报名信息&#xff0c;确认安全承诺和手写签名&#xff0c;提交报名后希望分配报名号&#xff0c;应该如何实现&#xff1f; 易查分的新建填表功能就可以实现上述需求&#xff0c;下面就来教大家如何制作吧。 &#x1f4cc;使…

【LORA协议栈】工作记录

一、硬件资源 MCU型号&#xff1a;STM32F401xE。Lora芯片&#xff1a;SX1276。硬件看门狗。ATT7022E三相电能专用计量芯片。 二、功能简介 作为一个组件&#xff0c;通过485与网关或者各种子设备连接在一起。支持boot升级。通过SPI与LORA芯片通信。接收和发送数据。有3路通信…

Java设计模式-活动对象与访问者

活动对象 Java设计模式中&#xff0c;活动对象是指一个对象始终处于活动的状态&#xff0c;该对象包括一个线程安全的数据结构以及一个活跃的执行线程。 如上所示&#xff0c;ActiveCreature类的构造函数初始化一个线程安全的数据结构&#xff08;阻塞队列&#xff09;、初始化…

Mac | Mac M 芯片应用意外退出问题

现象问题 电脑配置&#xff1a;MacBook Pro M1&#xff0c;系统 Sonoma 很多小伙伴新买了 M 芯片的 MacBook&#xff0c;在下载下应用后进行安装&#xff0c;安装成功后却无法打开&#xff0c;提示意外退出。报错如图 原因 部分应用过适配了 M 芯片&#xff0c;但还是有些应…

乡村振兴与农业科技创新:加大农业科技研发投入,推动农业科技创新,促进农业现代化和美丽乡村建设

一、引言 在当代中国&#xff0c;乡村振兴已成为国家发展的重要战略之一。作为国民经济的基础&#xff0c;农业的发展直接关系到国家的稳定和人民的福祉。随着科技的不断进步&#xff0c;农业科技创新在推动农业现代化和美丽乡村建设中发挥着越来越重要的作用。本文旨在探讨如…

TPK系列——2W 3KVDC 隔离单,双输出 DC/DC 电源模块

TPK系列是一款2W并且有高隔离电压要求的理想产品&#xff0c;工业级温度范围–40℃到 105℃&#xff0c;在此温度范围内都可以稳定输出2W&#xff0c;并且效率非常高&#xff0c;高达89%&#xff0c;同时负载调整率非常低&#xff0c;对于有输出电压精度有要求的地方特别合适&a…

桌面上怎么记工作任务更加合理?能设置桌面提醒的便签软件

在快节奏的现代工作中&#xff0c;电脑已成为我们处理工作的主要工具。每天&#xff0c;我们都要面对电脑屏幕&#xff0c;处理大量的工作任务。为了更好地管理这些琐碎却重要的工作&#xff0c;将工作任务直接记录在桌面上&#xff0c;随时查看和调整&#xff0c;无疑是一种高…