专栏首页SAP ERP管理实践深度解析SAP的锁机制

深度解析SAP的锁机制

该文主要是深入探讨在ABAP开发中如何使用SAP提供的应用层的锁机制来保证数据库表中的数据一致性。

如果几个用户要访问同样的资源,需要找到一种同步访问的方法去保持数据的一致性。比如说,在航班预订系统中,需要检查还有没有空座位,当检查的时候,你不想别人修改重要的数据,这种情况下,仅仅使用数据库级别的锁是不够的,还需要使用SAP提供的应用级的锁。

在SE11里创建锁对象,自定义的锁对象都必须以EZ或者EY开头来命名。一个锁对象里只包含一个PRIMARY TABLE,可以包含若干个SECONDARY TABLE, LOCK PARAMETERS里填写你要根据哪些字段来锁定表条目。

锁的模式有三种:E,S,X。

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

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

l 模式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_<锁对象名>,分别用来锁定和解锁。

当用逻辑锁来锁定表条目的时候,系统会自动向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.

在SAP系统中,当一个新屏幕显示的时候会释放掉Database锁,因为屏幕的改变会触发一个隐式的DB COMMIT。如果数据是从好几个屏幕收集来的话,而且在这段时间内这些数据会分别被锁定,仅仅用Database锁就不够了。

SAP系统在应用服务器层面有一个全局的LOCK TABLE,可以用来设置逻辑锁来锁定相关的表条目,并有ENQUEUE工作进程来管理这些锁。SAP锁是一种逻辑意义上的锁,有可能你锁定的表条目在DATABASE上根本就不存在。

使用锁的一般步骤是先上锁,上锁成功之后,从数据库取数据,然后更改数据,接着更新到数据库,最后解锁。按照这个步骤,才能保证更改完全运行在锁的保护机制下。只有在遵循锁机制的条件下才会起作用,对这个表进行操作的所有程序都要有这个锁表机制,锁才会起作用,如果一个程序按锁机制来加锁解锁进行操作,另外一个程序直接更新记录是可以的。

本文分享自微信公众号 - SAP ERP管理实践(gh_2013ee3d8459)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SAP_锁知识点

      SAP LUW要求数据库对象的锁定在SAP LUW结束释放,并且该数据库锁要求对所有SAP程序可见。SAP提供了一个逻辑数据锁定机制,该机制基于系统特定的锁...

    用户5495712
  • 压缩时间:宝洁供应链优化| 案例分享

    在宝洁的发展历程中,通过缩短距离,更加深入地研究消费者,是宝洁的第三核心竞争力。下面以宝洁公司的香波产品供应链优化为例,详细剖析宝洁供应链的优化方法。

    用户5495712
  • SAP 费用报销操作

    用户5495712
  • Java | 浅克隆与深克隆

    克隆,即复制一个对象,该对象的属性与被复制的对象一致,如果不使用Object类中的clone方法实现克隆,可以自己new出一个对象,并对相应的属性进行数据,这样...

    一个优秀的废人
  • 谷歌推出了针对企业人才搜索的AI解决方案

    谷歌希望客户借助AI更轻松地找到合格的求职者。为此,它今天宣布推出其Cloud Talent Solution(以前称为Cloud Job Discovery)...

    AiTechYun
  • 这些Spring中的设计模式,你都知道吗?

    设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。

    美的让人心动
  • 【深度学习】UPN分支介绍—深度信念网络基础原理与架构

    图像来源(http://www.cognitivetoday.com/wp-content/uploads/2016/10/DCN-600×392.png) 我...

    AiTechYun
  • 企业面试题: JavaScript中如何对一个对象进行深度clone

    (1)原始类型包括:数值、字符串、布尔值、null、undefined(后两个是特殊的原始值,这里不做详细的说明,我的上一篇博客有谈到过一些)

    舒克
  • 了解一下Spring中用了哪些设计模式?这样回答面试官才稳

    又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。

    JAVA葵花宝典
  • 知乎社区核心业务 Golang 化实践

    随着知乎用户的迅速增长和业务复杂度的持续增加,核心业务的流量在过去一年内增长了好几倍,对应的服务端的压力也越来越大。随着业务发展,我们发现 Python 作为动...

    李海彬

扫码关注云+社区

领取腾讯云代金券