赛跑网

 找回密码
 注册

QQ登录

只需一步,快速开始

快捷登录

查看: 7102|回复: 44

[P3J9]ABAP之锁机制实现

  [复制链接]
发表于 2010-11-26 16:48:55 | 显示全部楼层 |阅读模式
前面我们在SAP锁学习了如何实现锁,今天 我们来看看实现锁的原理。
一,SAP为什么要设置锁
1,保持数据的一致性:如果几个用户要访问同样的资源,需要找到一种同步访问的方法去保持数据的一致性,比如说,在订火车票时,需要检查有没有座位,当检查的时候,我们希望数据不要被修改。
2,仅仅用Database锁是不够的,数据库管理系统物理锁定了要修改的行记录,其他用户要等到数据库锁释放了才能访问这个记录。
  在SAP系统中,当一个新屏幕显示的时候会释放掉Database锁,因为屏幕的改变会触发一个隐式的DB COMMIT。如果数据从好几个屏幕收集来的话,而且在这段时间内这些数据会分别被锁定,仅仅用Database锁就不够了。
  SAP系统在应用服务器层面有一个全局的LOCKTABLE,可以用来设置逻辑锁来锁定相关的表条目,并有ENQUEUE工作进程来管理这些锁。SAP锁是一种逻辑意义上的锁,有可能你锁定的表条目在DATABASE上根本就不存在。

二,锁对象和其对应的Function Module
   在SE11里创建锁对象,自定义的锁对象都必须以EZ或者EY开头来命名。一个锁对象里只包含一个PRIMARY TABLE,可以包含若干个SECONDARY TABLE,锁的模式有三种:E,S,X。LOCK PARAMETERS里填写你要根据哪些字段来锁定表条目。
E:当更改数据的时候设置为此模式。
S:本身不需要更改数据,但是希望显示
X:与E类似,但是不允许累加,完全独占

1,如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,其他用户不能于对这个锁对象加E,X,S模式的任何一个。
2,如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,其他用户不能于对这个锁对象加E,X,S模式的任何一个。
3,如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,他用户不能于对这个锁对象加E,X。但是可以加S模式的锁。
4,如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,在这个程序,你还可以再对这个锁对象加E,S模式的锁,X模式不可以。
5,如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,在这个程序,不能于对这个锁对象加E,X,S模式的任何一个。
6,如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,在这个程序,你还可以再对这个锁对象加S模式的锁,如果没有别的用户加S模式的锁,那么你还可以对其加E模式的锁,但不能加X模式。

  当激活锁对象的时候,系统会自动创建两个函数,ENQUEUE_<锁对象名>和DEQUEUE_<锁对象名>,分别用来锁定和解锁。

三,锁定和解锁
  当用逻辑锁来锁定表条目的时候,系统会自动向LOCK TABLE中写入记录。
  当调用设置锁的函数时,LOCK PARAMETERS如果没有指明,系统会锁定整个表。当然,LOCK PARAMETE: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.

四,上锁的一般步骤
   
游客,如果您要查看本帖隐藏内容请回复

最近访客

  • wx_75910
    2022-10-21
  • austin
    2022-03-23
  • chenc880
    2021-07-03
  • IAmZenos
    2021-04-07
  • 042566
    2021-01-19
  • wangxiao
    2021-01-18




上一篇:[P3J8]ABAP之BatchInput实现
下一篇:[P3J10]ABAP之BADI实现
本楼点评(0) 收起
发表于 2011-3-24 12:59:11 | 显示全部楼层
学习中    。。。
本楼点评(0) 收起
发表于 2011-5-15 23:44:44 | 显示全部楼层
谢谢分享学习中····
本楼点评(0) 收起
发表于 2011-8-2 11:46:46 | 显示全部楼层
来学习的。
本楼点评(0) 收起
发表于 2011-8-4 16:12:00 | 显示全部楼层
学习一下SAP
本楼点评(0) 收起
发表于 2011-8-15 00:31:47 | 显示全部楼层
看看。学习。
本楼点评(0) 收起
发表于 2012-4-25 16:43:45 | 显示全部楼层
集腋成裘
本楼点评(0) 收起
发表于 2012-5-27 20:47:15 | 显示全部楼层
锁表!锁表!锁表!
本楼点评(0) 收起
发表于 2012-6-13 15:40:51 | 显示全部楼层
不错的学习资料。。。。
本楼点评(0) 收起
发表于 2012-6-14 12:44:33 | 显示全部楼层
又来了。。。。
本楼点评(0) 收起
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|联系我们|赛跑网 ( QQ:108519493QQfsq

GMT+8, 2024-4-26 01:58 , Processed in 0.299173 second(s), 65 queries .

Powered by 91SAP X3.4

© 2001-2023 91sap Team.

快速回复 返回顶部 返回列表