SAP Lock Object锁机制

news2024/11/24 11:11:04

一、锁机制

SAP LUW要求数据库对象的锁定在SAP LUW结束释放,并且该数据库锁要求对所有SAP程序可见。SAP提供了一个逻辑数据锁定机制,该机制基于系统特定的锁定服务应用服务器中的中心锁定表(即将加锁的信息记入数据库表)。一个ABAP程序在访问数据之前,将希望锁定的数据表关键字发送给该表,因此所有的程序在访问一个数据库表之前必须首先判断该表是否已经被锁定了。

SAP锁定与数据库物理锁定是不同的,它是一种业务逻辑上的锁定。它不会在物理表上进行加锁,而是将关键字传递给加锁函数,加锁函数会在特定表中加锁信息登记。

SAP LUW在结束时(提交或回滚),SAP锁定将会隐式解除。

Lock objects are used to lock the database table while making the modifications on the database table.  sap为了同步同时多个用户操作同一数据,防止数据出现不一致性而采用了锁机制。一般 sap会在操作数据前设置锁,防止第二个用户进行修改操作,当操作结束后系统会自动释放锁(当然程序也可以调用解锁函数去解锁)。

SAP为什么要设置锁:
1,
保持数据的一致性
如果几个用户要访问同样的资源,需要找到一种同步访问的方法去保持数据的一致性。比如说,在航班预订系
统中,需要检查还有没有空座位,当检查的时候,你不想别人修改重要的数据(空座位的数量)。
2,仅仅用Database锁是不够的
数据库管理系统物理锁定了要修改的行记录,其他用户要等到数据库锁释放才能访问这个记录。
在SAP系统中,当一个新屏幕显示的时候会释放掉Database锁,因为屏幕的改变会触发一个隐式的DB COMMIT
。如果数据是从好几个屏幕收集来的话,而且在这段时间内这些数据会分别被锁定,仅仅用Database锁就不够了。
SAP系统在应用服务器层面有一个全局的LOCK TABLE,可以用来设置逻辑锁来锁定相关的表条目,并有
ENQUEUE工作进程来管理这些锁。SAP锁是一种逻辑意义上的锁,有可能你锁定的表条目在DATABASE上根本就不存在。

、加锁解锁的思路/步骤

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

加锁维度:可以针对整个程序加锁,比如后台JOB程序,前一个没有执行完成,后一个不能启动。可以针对不同公司代码或不同的单据ID等加锁,根据不同业务场景需要确认锁的颗粒度。

三、建锁对象

在SE11里创建锁对象,自定义的锁对象都必须以EZ或者EY开头来命名。

新建完之后可以看到三个标签页。Attributes,Tables,Lock Parameter.

如果是接口对表进行操作,注意需要选上allow RFC.如图:

四、锁类型

独占锁:可写锁,一个用户正在修改数据时,阻止其他用户更改该数据。

共享锁只读锁,一个用户正在读数据时,阻止其他用户更改该数据。

Exclusive lock: The locked data can only be displayed or edited by a single user.

A request for another exclusive lock or for a shared lock is rejected.

Shared lock: More than one user can access the locked data at the same time in display

mode. A request for another shared lock is accepted, even if it comes from another user.

An exclusive lock is rejected.

Exclusive but not cumulative: Exclusive locks can be requested several times from the

same transaction and are processed successively. In contrast, exclusive but not

cumulative locks can be called only once from the same transaction. All other lock

requests are rejected.

五、锁方式

Tables标签下Primary Tables下两个输入项,name是表的名字,

lock mode有三种模式,分别是S,E,X.含义如下:

S (Shared lock, read lock)共享锁
E (Exclusive lock, write lock)写入锁
X (eXclusive lock, extended write lock, cannot be cumulated)专用,不累积
一般情况下,使用E模式

括号内为同一程序(即同一事务内)内,括号外为非同一程序内

S共享:本身不需要更改数据,但是希望显示的数据不被别人更改。

E专用累积:当更改数据的时候设置为此模式。

X专用不累积:和E类似,但是不允许累加,完全独占。

1、如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,其他用户不能再对这个锁对象加EX模式的锁,但是可以加S模式的锁;

2、如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,其他用户不能再对这个锁对象加EXS模式的任意一种锁;

3、如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,其他用户不能再对这个锁对象加EXS模式的任意一种锁;

4、如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,在这个程序,你还可以再对这个锁对象加S模式的锁,如果没有别的用户对其加S模式的锁,那么你还可以对其加E模式的锁,X模式的不可以;

5、如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,在这个程序,你还可以再对这个锁对象加ES模式的锁,X模式的不可以;

6、如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,在这个程序,你不可以再对这个锁对象加EXS模式的锁。

LOCK parameters里面默认的参数时表的主键,这样因为可以唯一的确定表的一行,通常情况下不用修改

一个锁对象里只包含一个PRIMARY TABLE,可以包含若干个SECONDARY TABLE,锁的模式有三种:E,S,X。LOCK PARAMETERS里填写你要根据哪些字段来锁定表条目。
模式E:当更改数据的时候设置为此模式。
模式S:本身不需要更改数据,但是希望显示的数据不被别人更改。
模式X:和E类似,但是不允许累加,完全独占。
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,其他用户不能再对这个锁对象加E、X、S模式
的任意一种锁;
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,其他用户不能再对这个锁对象加E、X、S模式
的任意一种锁;
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,其他用户不能再对这个锁对象加E、X模式的
锁,但是可以加S模式的锁;
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,在这个程序,你还可以再对这个锁对象加E、
S模式的锁,X模式的不可以。
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,在这个程序,你不可以再对这个锁对象加E、X、S模式的锁。

如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,在这个程序,你还可以再对这个锁对象加S模式的锁,如果没有别的用户对其加S模式的锁,那么你还可以对其加E模式的锁。X模式的不可以。
当激活锁对象的时候,系统会自动创建两个FM,ENQUEUE_<锁对象名>和DEQUEUE_<锁对象名>,分别用来锁
定和解锁。

六、加锁解锁

在SE11激活锁对象之后,系统会自动生成两个 FM 来进行锁管理,一个用来对对象进行锁定,另一个是释放对象。二者的名字都很有规律。

DEQUEUE_<lock object的名字> 释放lock object的锁定(lock the table)
ENQUEUE_<lock object的名字> 对象lock object要求的锁定(removing lock on the table)

到时要使用的时候直接call function module即可。

当用逻辑锁来锁定表条目的时候,系统会自动向LOCK TABLE中写入记录。
当调用设置锁的FM时,LOCK PARAMETERS如果没有指明,系统会锁定整个表。

当然,LOCK PARAMETER:CLIENT有点特殊,如果不指定,默认是SY-MANDT;

如果指定相应的CLIENT,会锁定对应CLIENT上的相应的表记录;如果设置为SPACE,则锁定涉及所有的CLIENT。
当逻辑锁设置失败后,一般会有两种例外。一个是EXCEPTION:FOREIGN_LOCK,意思是已经被锁定了;另一个是EXCEPTION:SYSTEM_FAILURE。
有些情况下,程序中设置成功的逻辑锁会隐式的自己解锁。比如说程序结束发生的时候(MESSAGE TYPE为A或者X的时候),使用语句LEAVE PROGRAM,LEAVE TO TRANSACTION,或者在命令行输入/n回车以后。
在程序的结束可以用DEQUEUE FUNCTION MODULE来解锁(当然如果你不写这个,程序结束的时候也会自动的解锁),这个时候,系统会自动从LOCK TABLE把相应的记录删除。使用DEQUEUE FUNCTION MODULE来解锁的时候,不会产生EXCEPTION。要解开你在程序中创建的所有的逻辑锁,可以用FM:DEQUEUE_ALL.

用于设锁的 FM 为: ENQUEUE_<锁对象名>它用于在锁表(Lock Table)中生成一个锁项(Lock Entry)。若设锁不成功的话,就会在 Return 中反映出来。

用于释放锁的 FM 为:DEQUEUE_<锁对象名>它用于从锁表中删除一个锁项。

ABAP 程序中,只需使用 "CALL FUNCITION ..." 语句就可以调用它们。

这两个锁 FM 是在 SAP 系统的一个特殊工作进程中执行的,专门进行锁管理。它运行在一个单独的服务器上,而该服务器专门用于维护整个 SAP 系统的主锁表(Central Lock Table)。

lock Table

CALL FUNCTION 'ENQUEUE_E_TABLE'

EXPORTING

tabname = table_name

EXCEPTIONS

foreign_lock = 1

system_failure = 2

OTHERS = 3.

Unlock Table

CALL FUNCTION 'DEQUEUE_E_TABLE'

EXPORTING

tabname = table_name

七、锁参数设置

锁参数SCOPE设置

_SCOPE = 1: The lock is not sent to the update program. The lock is removed when the transaction is ended.

_SCOPE = 2: The lock is sent to the update program. The update program is responsible for removing the lock. The dialog program which requested the lock no longer has an influence on the lock behavior. This is the standard setting for the ENQUEUE function module.

_SCOPE = 3: The lock

八、锁查看

如果程序出现死锁状态,可以通过TCODE: SM12去诊断,手工删除相关的锁定。

九、TCODE、相关表、多表锁

       1)TCODE:SE11, SM12

            可以通过se11来查看和创建锁对象,锁对象创建完毕之后,统会自动创建两个FM,ENQUEUE_<锁对象名>和DEQUEUE_<锁对象名>,分别用来锁定和解锁。

       2)相关表:

      DD25L:组合标题(方式,MC目标,锁定目标)(纪录了锁主表);

      DD25T:

      DD26S:视图的基本表和外来码关系(纪录了所有和锁相关的表);

      DD27S:合计(视图,MC对象,锁定对象)字段;

      3)多表锁

      在SE11里创建锁对象,自定义的锁对象都必须以EZ或者EY开头来命名。一个锁对象里只包含一个PRIMARY TABLE,可以包含若干个SECONDARY TABLE。如多表锁:EMEKKOE,主表:EKKO-->E 专用累积,从表:EKPO-->E 专用累积。

       十、锁的生命周期

       通常程序一运行就要对特殊记录进行ENQUEUE处理,程序运行完毕之后进行DEQUEUE处理(不显示处理的话,关闭该session的时候,sap会自动DEQUEUE)。

       十一、锁的作用范围

       sap锁仅对特定程序起作用,假设A程序改table1的第1条记录,B程序也改table1的第1条记录,A程序一运行就对table1的第1条记录加锁,B程序则未加锁,则B程序仍可以改table1的第1条记录内容。

   十二、通用的加锁和解锁函数

      1、ENQUEUE_E_TABLE/DEQUEUE_E_TABLE,没创建锁对象的时候使用;

      2ENQUEUE_ESFUNCTION/DEQUEUE_ESFUNCTION,没创建锁对象的时候使用;

      3ENQUEUE_ES_PROG/DEQUEUE_ES_PROG,用于控制同一个程序不能并发执行;

      4DEQUEUE_ALL,解同一个程序中创建的所有锁。

   十三、锁的应用

  1. 按表加锁

最常用的场景,按表的关键字等需要字段加锁解锁单据

     2. 按程序加锁

Se11锁定义

锁对象名称

EZ_ZSFI054

程序按公司锁定

属性

允许RFC勾选

锁模式

X专用,不累积

锁主表

ZSFI054结构

锁参数

ZSFI054结构所有字段

应用:一个程序在跑后台JOB没有执行完成,不可启用下一个job

FORM frm_check_job .
  IF sy-batch EQ abap_true.
    CALL FUNCTION 'ENQUEUE_EZ_ZSFI054'
      EXPORTING
        cprog          = sy-cprog
        cate           = '1'
        _scope         = '1'
      EXCEPTIONS
        foreign_lock   = 1
        system_failure = 2
        OTHERS         = 3.
    IF sy-subrc <> 0.
      WRITE / '前一个后台任务还在运行中'.
      STOP.
    ENDIF.

  ENDIF.
ENDFORM.
  1. 对编号范围对象SNRO加锁

应用:ZFI*  收入共享平台任务推送程序

FORM frm_get_next_id USING uv_bukrs CHANGING cv_id.
  DATA: lv_id TYPE char6,
        quant LIKE inri-quantity, "dummy
        code  LIKE inri-returncode. "returncode

  CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
    EXPORTING
      object           = 'ZFI0047'
    EXCEPTIONS
      foreign_lock     = 1
      object_not_found = 2
      system_failure   = 3
      OTHERS           = 4.
  IF sy-subrc = 0.
    CALL FUNCTION 'NUMBER_GET_NEXT'
      EXPORTING
        nr_range_nr             = '01'
        object                  = 'ZFI0047'
      IMPORTING
        number                  = lv_id
        quantity                = quant
        returncode              = code
      EXCEPTIONS
        interval_not_found      = 1
        number_range_not_intern = 2
        object_not_found        = 3
        quantity_is_0           = 4
        quantity_is_not_1       = 5
        interval_overflow       = 6
        buffer_overflow         = 7
        OTHERS                  = 8.
    CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
      EXPORTING
        object           = 'ZFI0047'
      EXCEPTIONS
        object_not_found = 1
        OTHERS           = 2.
    CONCATENATE uv_bukrs 'TK' sy-datum+0(6) lv_id INTO cv_id.
  ENDIF.
ENDFORM.


 

check this link :

SAP Help Portal

http://help.sap.com/saphelp_40b/helpdata/en/cf/21eea5446011d189700000e8322d00/content.htm

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

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

相关文章

文档翻译软件哪个好用?后悔没早发现这5款

在学术研究的道路上&#xff0c;英文文献翻译无疑是一项挑战重重的任务&#xff01; 作为一名经常与英文文献打交道的学者&#xff0c;我一直在寻找能够简化这一过程的工具。最近&#xff0c;我发现了一些英文文献翻译在线免费工具&#xff0c;它们提供了文档翻译的功能&#…

IC rankIC

IC IC衡量的是预测值和实际值之间的相关系数 计算公式为&#xff1a;IC Pearson(R(predicted),R(actual)) 取值范围&#xff1a;[-1, 1]&#xff0c;其中1表示完全相关&#xff0c;也就是预测值和实际值完全一样。0表示完全不相关&#xff0c;-1表示&#xff0c;反向相关 ra…

Catf1ag CTF Web(八)

前言 Catf1agCTF 是一个面向所有CTF&#xff08;Capture The Flag&#xff09;爱好者的综合训练平台&#xff0c;尤其适合新手学习和提升技能 。该平台由catf1ag团队打造&#xff0c;拥有超过200个原创题目&#xff0c;题目设计注重知识点的掌握&#xff0c;旨在帮助新手掌握C…

「Qt Widget中文示例指南」如何实现一个旋转框(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 旋转框示例展示了如…

别选错了!一篇文章讲清Midjourney 和 Stable Diffusion的区别

24年无疑标志着AI时代的崭新篇章&#xff0c;各类AI软件如同春日里迅速生长的竹笋&#xff0c;层出不穷&#xff0c;其功能之丰富令人目不暇接&#xff0c;竞相在各自的领域内抢占前沿阵地。 在众多 AI 绘画工具中&#xff0c;Midjourney 和 Stable Diffusion 是最为人熟知的两…

大数据背景下基于Python的牛油果销售数据可视化分析

注&#xff1a;源码在最后&#xff0c;只是一次实验记录&#xff0c;不合理的地方自行修改。 一 研究背景及意义 21世纪以来&#xff0c;随着科学技术的进步&#xff0c;人们的生活水平也随之大幅提升提高。在科技和经济快速发展下&#xff0c;全球已经进入了大数据时代。大数…

Stable Diffusion 适合亚洲人的摄影级画质LEOSAM‘s HelloWorld XL 大模型V6版本来啦!

前言 LEOSAM’s HelloWorld XL大模型早在SD1.5时代&#xff0c;就曾经被多次推荐&#xff0c;该作者LEOSAM于4月20日发布了其最新LEOSAM’s HelloWorld XL V6版本大模型。该模型在摄影、光影等方面表现非常优秀。HelloWorld XL V6版本是在V5版本的基础上迭代改进的。根据作者LE…

【JAVA入门】Day23 - 查找算法

【JAVA入门】Day23 - 查找算法 文章目录 【JAVA入门】Day23 - 查找算法一、基本查找二、二分查找 / 折半查找三、分块查找 查找算法我们常用的有&#xff1a; 基本查找二分查找 / 折半查找分块查找插值查找斐波那契查找树表查找哈希查找 这里我们着重讲解前三种&#xff0c;其…

计算机Java项目|基于SpringBoot的精简博客系统的设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

第47课 Scratch入门篇:水果忍者

水果忍者 故事背景: 水果忍者是一款传统的非常好玩的游戏,我们通过鼠标控制水果刀,把弹出的水果切掉,如果切到地雷则扣分,这款游戏非常好玩,现在我们现在通过Scratch 把它做出来,! 程序原理: 这款游戏难点就是水果的抛起和下降,由于角色是从下往上走,也就是 Y 坐标…

ip归属地换地方了会自动更新吗

在这个数字化时代&#xff0c;互联网已成为我们生活、工作和学习中不可或缺的一部分。而每一个连接互联网的设备&#xff0c;都会通过其IP地址与外界进行通信。IP地址&#xff0c;这个看似简单的数字组合&#xff0c;实则承载着设备位置、网络身份等重要信息。随着人们移动性的…

重生奇迹MU:穿越时光的辉煌篇章

在远古的曙光中&#xff0c;奇迹重现&#xff0c;MU大陆迎来了前所未有的荣耀重生&#xff01;重生奇迹MU&#xff0c;一款融合经典与创新&#xff0c;跨越时空界限的奇迹之旅&#xff0c;邀您共赴一场梦幻与热血交织的冒险盛宴。 经典重塑&#xff0c;传奇再续 重拾昔日辉煌…

贝叶斯神经网络bnn pyro 包 bayesian-neural-network在人工智能领域应用,预测金融市场价格

在人工智能领域&#xff0c;预测金融市场价格一直是一个热门话题。本文将介绍一种新颖的方法——贝叶斯神经网络&#xff0c;用于预测市场动态&#xff0c;以虚拟货币“以太币”为例进行说明。 ### 贝叶斯神经网络&#xff1a;一种新视角 对于希望深入了解贝叶斯神经网络的读者…

【递归专题一】Pow(x,n)-快速幂算法

Pow(x,n)-递归及迭代实现 题目链接&#xff1a;Pow(x,n) 解法一&#xff1a;暴力循环 如210则用10个2相乘&#xff0c;但是如果n231-1&#xff0c;难道我们还要用n231-1个2相乘吗&#xff1f;这样显然会超时。 解法二&#xff1a;快速幂算法 递归实现 任意数的指数都可以用二…

骑行耳机怎么选?精选五款权威实测热卖机型

作为一位深耕于运动科技领域多年的博主&#xff0c;可以说在此之间测试评论过各类运动装备&#xff0c;其中对于骑行爱好者而言&#xff0c;不可或缺的就是一款可以提高骑行体验的蓝牙耳机&#xff0c;其中&#xff0c;骨传导耳机凭借佩戴舒适健康等特点&#xff0c;收获了各类…

[星瞳科技]OpenMV如何进行串口通信?

串口通信上 视频教程27 - 串口通信发送数据&#xff1a;OpenMV串口发送数据 | 星瞳科技 视频教程28 - 串口通信接收数据&#xff1a;OpenMV串口接收数据 | 星瞳科技 介绍 为什么要用串口呢&#xff1f;因为要时候需要把信息传给其他MCU&#xff0c;串口简单&#xff0c;通用…

Qt-enable介绍使用(10)

目录 enable() 描述 相关 使用 观察切换过程 enable() 描述 相关 使用 观察切换过程 我们新建一个项目&#xff0c;设置两个按钮&#xff0c;并且把第二个按钮的objectName改一个明显的名字 关于名字这一点补充&#xff0c;显然我们在实际中要注意对象名字要尽量的通俗易…

C语言中函数sizeof和strlen区别

sizeof和strlen是C语言中的两个常用函数&#xff0c;它们的作用和使用方式有所不同。 sizeof sizeof是一个运算符而非函数&#xff0c;用于计算数据类型或变量占用的字节数。它可以计算任意数据类型&#xff08;包括基本类型、自定义结构体、数组等&#xff09;的大小。例如&…

如何使用博达网站群管理平台的树状导航

1 介绍 由于网站建设需要&#xff0c;需在首页的左边竖栏部分使用树状导航。我又过了一遍《网站群管理平台用户手册》&#xff0c;没发现如何在网站的首页设置树状导航组件。昨天&#xff0c;我之所以在创建树状导航上不知所措&#xff0c;是因为平台本身有一些误导&#xff0…

捷途山海T2 VS 唐DM-i:谁主沉浮?

自从新能源技术涌入汽车界&#xff0c;国内自主品牌便凭借电力驱动实现了跨越式发展。众多卓越车型如雨后春笋般涌现&#xff0c;在消费者市场中与合资品牌形成了激烈竞争&#xff0c;这无疑也增加了消费者选择车辆的难度。面对琳琅满目的优秀车型&#xff0c;消费者很容易陷入…