ABAP 锁对象

news2024/11/20 23:36:53

需求场景

最近收到用户反馈,发现同一个托运单生成了两个不同的服务订单以及根据同一个送货单生成了两个托运单,经过排查,发现原因都是由同样的问题导致的,多窗口或者多用户同时对一条数据操作,就会出现这种现象。这个时候就需要用到锁对象

背景知识

  • 数据库锁是指为防止多人同时操作数据库导致数据不一致而采取的一种机制,在每次数据库提交或者回滚之后该锁定就被释放。
  • SAP ABAP 语言的锁是在语言层面设计的一种锁机制,它是一种逻辑锁,独立于数据库锁。该机制基于系统特定的锁定服务应用服务器中的中心锁定表(即将加锁的信息记入数据库表)。一个ABAP程序在访问数据之前,将希望锁定的数据表关键字发送给该表,因而所有的程序在访问一个数据库表之前必须首先判断该表是否已经被锁定了。
  • SAP锁定与数据库物理锁定是不同的,它是一种业务逻辑上的锁定。它不会在物理表上进行加锁,而是将关键字传递加锁函数,加锁函数会在特定表中进加锁信息登记。

创建锁对象

  • 自定义的锁对象都必须以EZ或者EY开头来命名。一个锁对象里只包含一个PRIMARY TABLE,可以包含若干个SECONDARY TABLE。
  • 激活该对象后,系统自动生成两个功能函数,名称为ENQUEUE_LOCK OBJECT和DENQUEUE_LOCK OBJECT,其中LOCK OBJECT是锁对象的名称。
  • 当调用设置锁函数时,LOCK PARAMETERS如果没有指明,系统会锁定整个表。
  • 有些情况下,程序中设置的逻辑锁会隐式的自己解锁。比如说程序结束发生的时候(MESSAGE TYPE为A或者X的时候),使用语句LEAVE PROGRAM,LEAVE TO TRANSACTION,或者在命令行输入/n回车以后。
  • 在程序的结束可以用DEQUEUE FUNCTION MODULE来解锁(当然如果你不写这个,程序结束的时候也会自动的解锁),这个时候,系统会自动从LOCK TABLE把相应的记录删除。使用DEQUEUE FUNCTION MODULE来解锁的时候,不会产生EXCEPTION(不需要对系统返回码sy-subrc进行判断)。如是要解开你在程序中创建的所有的逻辑锁,可以用函数:DEQUEUE_ALL.

锁模式

  • 独占锁
    锁定的数据仅可由一个用户进行显示或编辑。对另一独占锁或共享锁的请求均将遭到拒绝。
  • 共享锁
    多个用户可同时读取访问相同的数据。然而,一旦任何一个用户在处理数据,第二个用户就不能再访问此数据。接受对其它共享锁的请求,即使这些共享锁来自不同的用户。拒绝对独占锁的请求。
  • 独占但不累计锁
    鉴于独占锁可由相同的事务请求多次并逐个释放,因此独占非累计锁只能由相同的事务请求一次。所有的其它锁请求都将被拒绝。
    在这里插入图片描述

SM12锁查看与维护

  • 当使用程序加锁时,在可加锁的情况下,会即时的产生一条锁信息数据,可以通过SM12查看所产生的锁信息数据。
  • 通过SM12,还可以删除锁记录,让数据不再锁定.
  • 锁参数是由锁对象的关键字组成的。

锁函数实现代码

*_scope:1 表示程序内有效; 2 表示 update module 内有效; 3 全部

*_wait 表示如果对象已经被锁定,是否等待后再尝试加锁,最大的等待时间有系统参数 ENQUE/DELAY_MAX控制

*_COLLECT 参数表示是否收集后进行统一提交,COLLECT 是一种缓存与批处理方法,即如果指定了Collect,加锁信息会放到Lock Container 中,Lock Container实际上是一个funciton Group控制的内存区域,如果程序中加了很多锁,锁信息会先放到内存中,这样可以减少对SAP锁管理系统访问,若使Lock Container中的锁生效,需执行FLUSH_ENQUEUE 这个Funciton,将锁信息更新到锁管理系统中,此时加锁操作生效,使用函数RESET_ENQUEUE可以清除Lock Container中的锁信息
    “加锁
    CALL FUNCTION 'ENQUEUE_EZ_LIKP'
      EXPORTING
        mode_likp      = 'E'
        mandt          = sy-mandt
        vbeln          = lt_dn-vbeln 
*       X_VBELN        = ' '  "是否使用初始值填充参数
*       _SCOPE         = '2'
*       _WAIT          = ' '
*       _COLLECT       = ' '
      EXCEPTIONS
        foreign_lock   = 1
        system_failure = 2
        OTHERS         = 3.
    IF sy-subrc <> 0.
      l_err = 'X'.
      CLEAR: lv_lock_msg.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          msgid               = sy-msgid
          msgnr               = sy-msgno
          msgv1               = sy-msgv1
          msgv2               = sy-msgv2
          msgv3               = sy-msgv3
          msgv4               = sy-msgv4
        IMPORTING
          message_text_output = lv_lock_msg.
      MESSAGE lv_lock_msg TYPE 'I'.
      EXIT.
    ENDIF.
   
   "解锁,解锁前先判断是否存在锁,在加锁后,程序出现返回操作或保存操作处都需要解锁
      REFRESH:lt_enq.
      CALL FUNCTION 'ENQUEUE_READ'
        EXPORTING
          gname                 = 'LIKP'
          guname                = ''
        TABLES
          enq                   = lt_enq[]
        EXCEPTIONS
          communication_failure = 1
          system_failure        = 2
          OTHERS                = 3.

      REFRESH:lt_tyd_item.
      MOVE-CORRESPONDING g_it_item[] TO lt_tyd_item[].
      SORT lt_tyd_item BY vbeln.
      DELETE ADJACENT DUPLICATES FROM lt_tyd_item COMPARING vbeln.

      LOOP AT lt_tyd_item.
        LOOP AT lt_enq WHERE garg CS lt_tyd_item-vbeln .
          CALL FUNCTION 'DEQUEUE_EZ_LIKP'
            EXPORTING
              mode_likp = 'E'
              mandt     = sy-mandt
              vbeln     = lt_tyd_item-vbeln
*             X_VBELN   = ' '
*             _SCOPE    = '3'
*             _SYNCHRON = ' '
*             _COLLECT  = ' '
            .
        ENDLOOP.
      ENDLOOP.

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

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

相关文章

Learning C++ No.19【搜索二叉树实战】

引言&#xff1a; 北京时间&#xff1a;2023/5/2/9:18&#xff0c;五一放假第四天&#xff0c;昨天本来想要发奋图强将该篇博客写完&#xff0c;但是摆烂了一天&#xff0c;导致已经好几天没有码字&#xff0c;敲代码了&#xff0c;此时难受的感觉涌上心头&#xff0c;但是摆烂…

DNF类游戏动作实现(C语言)

没有接触制作小游戏前&#xff0c;感觉做游戏很不可思议&#xff0c;游戏里的人物是怎么移动的&#xff0c;怎么攻击&#xff0c;释放技能。。。。。。现在逐渐了解到之后&#xff0c;发现2d游戏人物的动作更多是图片的拼接&#xff0c;动作是否精细&#xff0c;由这个动作的帧…

鲲鹏展翅 信安高飞 | 鲲鹏开发者峰会2023-麒麟信安技术论坛成功举办!

2023年5月6日-7日&#xff0c;以“创未来 享非凡”为主题的鲲鹏开发者峰会2023在东莞松山湖举办。鲲鹏产业生态繁荣&#xff0c;稳步发展&#xff0c;正在成为行业核心场景及科研领域首选&#xff0c;加速推动数字化转型。 作为鲲鹏生态重要合作伙伴&#xff0c;麒麟信安受邀举…

企企通:B2B商城四种“玩法”,一站式解决端到端全链路需求!

商城系统在电商零售领域中&#xff0c;一直是助力商家搭建商城的核心工具&#xff0c;随着电商行业的发展&#xff0c;各种新模式随即出现&#xff0c;与此同时也出现了各种各样的商城系统&#xff0c;而B2B商城是这其中最为常见的商城系统。 近年来&#xff0c;由于电子商务的…

相遇于此,相交链表的解题心得

本篇博客会讲解力扣“160. 相交链表”的解题思路&#xff0c;这是题目链接。 老规矩&#xff0c;先来审题。这道题的题干有点长&#xff0c;简而言之&#xff0c;就是判断2个链表是否相交&#xff0c;如果相交就返回第一个相交结点&#xff0c;不相交就返回NULL。看看题目原文…

【C++中可调用对象和function】

C中有如下几种可调用对象&#xff1a;函数、函数指针、lambda表达式、bind对象、仿函数。其中&#xff0c;lambda表达式和bind对象是C11标准中提出的(bind机制并不是新标准中首次提出&#xff0c;而是对旧版本中bind1st和bind2st的合并)。个人认为五种可调用对象中&#xff0c;…

FM33A048B LPUART

概述 LPUART 是一个低功耗UART 接口&#xff0c;其工作仅需32768Hz 时钟&#xff0c;可以支持到最高9600 波特率的数据接收。LPUART 功耗极低&#xff0c;可以在Sleep/DeepSleep 模式下工作。 特点&#xff1a; ⚫ 异步数据收发 ⚫ 标准UART帧格式 ◼ 1bit起始位 ◼ 7或8bit数据…

【ChatGPT Prompt Engineering】面向Java开发者的ChatGPT提示词工程(1)

各位Java开发者们&#xff0c;欢迎来到万猫学社&#xff01;在这里&#xff0c;我将和大家分享ChatGPT提示词工程的系列文章&#xff0c;希望能够和大家一起学习和探讨提示词的最佳实践。 虽然互联网上已经有很多有关提示词的材料&#xff0c;比如那些“每个人都必须知道的30个…

lua是什么?lua的基本语法知识点

目录 一、lua是什么&#xff1f; 二、lua的基本语法 1.运行lua脚本文件 2.注释 3.标示符 4.关键词 5.全局变量 三、数据类型 8个基本类型 1.nil(空&#xff09; 2.boolean&#xff08;布尔&#xff09; 3.number(数字&#xff09; 4.string(字符串&#xff09; 5…

一图看懂 six 模块:最常见的 POSIX 系统调用, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 six 模块&#xff1a;最常见的 POSIX 系统调用, 资料整理笔记&#xff08;大全&#xff09; 摘要模块图类关系图模块全展开【six】统计常量intboolstrtuplelist 模块24 fun…

电脑屏幕开机后一直闪不停怎么办?电脑屏幕闪烁的解决方法

不少电脑用户经常会遇到的一种情况&#xff0c;就是开机后&#xff0c;发现电脑屏幕一直闪不停&#xff0c;十分伤眼。驱动人生就为大家带来电脑屏幕闪烁的解决方法。 首先&#xff0c;驱动人生建议可以排查一下出现电脑屏幕闪烁的原因&#xff0c;从而更加针对性的解决故障。…

SpringBoot 整合第三方技术Junit+MyBatis+Druid

测试类中加两个注解就行 SpringBootTest(classes Application.class)//添加SpringBoot 的启动类&#xff0c;万无一失 RunWith(SpringJUnit4ClassRunner.class) public class SpringBootJunitTest {Testpublic void test(){System.out.println("ddddddddddddddddddd&quo…

四象限法则定量分析法,如何客观划分需求优先级?

四象限法按照重要和紧急程度&#xff0c;划分为4个象限&#xff1a;重要且紧急、重要不紧急、不重要但紧急、不重要不紧急。那么我们如何客观地对需求进行评估&#xff0c;并将其放到对应的象限&#xff1f; 我们可以使用定量分析方法对象限进行划分和定值。在横纵坐标中&#…

php+mysql求职招聘人才网站

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户[10]。 2&#xff0e;系统用户管理&#xff1a;不…

温湿度换算绝对含水量

常压下 公式如下 y z * ( 8.0141786694E-09*x^5 2.3071566385E-06*x^4 1.3157923494E-04*x^3 1.1376256438E-02*x^2 3.1867343275E-01*x 4.9021104226E00 ) 式子中 z 相对湿度 单位百分比 x 摄氏度 单位度 取值范围 5-100度 y 绝对湿度 单位 克每立方…

OSPF原理—详细!!

OSPF&#xff08;open shortest path first&#xff09;&#xff1a;开放式最短路径优先 定义&#xff1a;是基于链路状态算法的路由协议 为什么要用OSPF&#xff1f; 网络发生变化&#xff0c;静态路由需要手动配置&#xff0c;太麻烦无法响应网络变化&#xff0c;需要手动更…

鸟哥的Linux私房菜——基础学习篇(第三版) (11-17章)

基础学习篇 第十一章 &#xff1a;认识和学习bash第十二章 &#xff1a;正则表达式与文件格式化处理第十三章 &#xff1a;学习shell script第十四章 &#xff1a;Linux账号管理与ACL权限设定第十五章 &#xff1a;磁盘配额(Quota)与进阶文件系统管理第十六章 &#xff1a;例行…

C++List类详解

目录 1.List介绍 2.List的常见使用 2.1 list的构造函数 2.2 list iterator的使用 2.3 list capacity 2.4 list element access 2.5 list modifiers 2.6 list的迭代器失效 3.List的模拟实现 3.1 list模拟实现&#xff08;可跳过&#xff09; 3.2 反向迭代器实现 3.2.1 list反…

100天精通Python(可视化篇)——第86天:matplotlib绘制不同种类炫酷热力图参数说明+代码实战

文章目录 专栏导读一、热力图介绍1. 介绍2. 参数说明 二、绘制热力图1. 普通热力图2. 添加坐标轴和标题3. 添加热力标尺4. 添加色块数值5. 修改热力图颜色6. 突出特殊数据 三、应用场景1. 适用场景2. 不适用场景 专栏导读 &#x1f525;&#x1f525;本文已收录于《100天精通P…

如何提高亚马逊卖家订单量?这些建议和技巧值得收藏

作为全球最大的电商平台之一&#xff0c;亚马逊拥有庞大的客户基础和丰富的销售渠道&#xff0c;这对于亚马逊卖家来说是一个非常宝贵的机会。但是&#xff0c;如何提高亚马逊卖家订单量是一个非常重要的问题。在本文中&#xff0c;我将分享一些提高亚马逊卖家订单量的建议和技…