(转)ABAP--如何获取SAP标准表的相关的锁(lock)

 (转)ABAP--如何获取SAP标准表的相关的锁(lock)

1.sap锁的概念
SAP为了同步同时多个用户操作同一数据,防止数据出现不一致性而采用了锁机制。一般 SAP会在操作数据前设置锁,防止第二个用户进行修改操作,当操作结束后系统在释放锁。
2.SAP锁的类型
Exclusive lock
The locked data can be read or processed by one user only. A request for another exclusive lock or for a shared lock is rejected.
Shared lock
Several users can read the same data at the same time, but as soon as a user edits the data, a second user can no longer access this data. Requests for further shared locks are accepted, even if they are issued by different users, but exclusive locks are rejected.
Exclusive but not cumulative lock
Exclusive locks can be requested by the same transaction more than once and handled successively, but an exclusive but not cumulative lock can only be requested once by a given transaction. All other lock requests are rejected.
3.相关TCODE
SE11
4.相关表
DD25L:组合标题(方式,MC目标,锁定目标)(纪录了锁主表)
DD25T:
DD26S:视图的基本表和外来码关系(纪录了所有和锁相关的表)
DD27S:合计(视图,MC对象,锁定对象)字段
5.相关函数
RS_DD_ENQU_EDIT
RS_DD_ENQU_ADD


6.获取表相关锁的列表程序
REPORT  ZRFI0090 LINE-COUNT 70
                 LINE-SIZE  255
                 NO STANDARD PAGE HEADING.
type-pools: slis.
tables: DD02L,dd26s.
data: begin of g_tab occurs 10,
  TABNAME like dd26s-TABNAME,
  VIEWNAME type dd26s-VIEWNAME,
  ename like EMFIN-FBEMFIN,
  dname like EMFIN-FBEMFIN,
end of g_tab.
data g_fcat  type slis_t_fieldcat_alv.
data:  g_fieldcat type slis_fieldcat_alv.
select-options s_table for dd02l-TABNAME default 'VBAK'.
end-of-selection.
  select dd26s~TABNAME dd25l~VIEWNAME
  INTO CORRESPONDING FIELDS OF TABLE g_tab
  from dd26s
  inner join dd25l
    on dd26s~VIEWNAME = dd25l~VIEWNAME
       and dd25l~AGGTYPE = 'E'
    where TABNAME in s_table.
  loop at g_tab.
    concatenate 'ENQUEUE_' g_tab-VIEWNAME into g_tab-ename.
    concatenate 'DEQUEUE_' g_tab-VIEWNAME into g_tab-dname.
    modify g_tab.
  endloop.
  call function 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name     = 'ZTEST4'
      I_INTERNAL_TABNAME = 'G_TAB'
      i_inclname         = 'ZTEST4'
    CHANGING
      ct_fieldcat        = g_fcat.
  g_fieldcat-fieldname = 'ENAME'.
  g_fieldcat-seltext_s = '加锁函数名'.
  append g_fieldcat to g_fcat.
g_fieldcat-fieldname = 'DNAME'.
  g_fieldcat-seltext_s = '解锁函数名'.
  append  g_fieldcat to g_fcat.
  call function 'REUSE_ALV_GRID_DISPLAY'
    exporting
*      i_callback_program       = repname
*      i_callback_user_command  = g_user_command
*      i_structure_name         = 'INV'
*      is_layout                = layout
       it_fieldcat              = g_fcat
*      is_variant               = g_variant
*      it_events                = events[]
*      i_callback_pf_status_set = 'F01_ALV_EVENT_PF_STATUS_SET'
    tables
      t_outtab                 = g_tab.
7.通过断点找程序所用到的锁
用se38打开程序LSENAF01,并定位到send_enqueue子过程,在该过程中的任一语句设置断点。完成断点设置后,则去执行标准tcode,系统就会在程序调用锁时自动停止在断点处,这时你就可以通过调用堆栈获取加锁函数(ENQUEUE_XXXXXX),其中"XXXXXX"就是锁名称,你就可以通过SE11查看锁信息。
8.有多个表的锁的样例
锁:EMEKKOE
  主表:EKKO-->E 专用累积
  从表:EKPO-->E 专用累积
  参数:   

### ABAP 机制概述 ABAP机制是为了防止多个用户同时修改同一数据而导致的数据不一致性问题。这种机制不同于数据库级别的物理,而是通过逻辑方式实现的,在 SAP 系统中被称为 **中央 (Central Lock Table)** 进行统一管理。 #### 创建对象 在使用 ABAP 之前,需要先定义一个对象。这可以通过事务码 `SE11` 完成。创建过程中需要注意以下几点: - 对象名称通常以字母 `E` 开头。 - 需要指定与相关格及其字段,并设置模式(Lock Mode),包括独占(Exclusive)、共享(Shared)以及其他特定类型的[^3]。 完成配置并激活之后,系统会自动为该对象生成一对功能模块(Function Module, FM)用于管理和释放资源: -的功能模块名为:`ENQUEUE_<对象名>`; - 释放的功能模块名为:`DEQUEUE_<对象名>`。 这些功能模块会在专用的工作进程中被执行,负责更新和维护集中式的主记录[^1]。 #### 实现加解过程 实际开发时,开发者需利用标准语法调用上述提到的功能模块来实施具体的定行为: ```abap DATA: lv_lock_result TYPE string. CALL FUNCTION 'ENQUEUE_EYOURLOCKOBJECT' EXPORTING mandt = sy-mandt object_key = your_object_key_value * IMPORTING * RETURN = . IF sy-subrc NE 0. " 处理无法获得的情况 ENDIF. " 执行业务逻辑... CALL FUNCTION 'DEQUEUE_EYOURLOCKOBJECT' EXPORTING mandt = sy-mandt object_key = your_object_key_value . ``` 以上代码片段展示了如何正确地获取及随后解除某个具体对象上的状态。如果尝试加失败,则应依据返回值做出适当反应;同样重要的是记得总是适时清理不再使用的条目以防死发生[^1]。 另外值得注意的一点是,对于某些场景下可能需要用到动态构建的方式来进行更加灵活广泛的定控制,这时可以考虑采用如下形式的通用接口函数进行操作: ```abap CALL FUNCTION 'ENQUEUE_E_TABLE'. ... CALL FUNCTION 'DEQUEUE_E_TABLE'. ``` 这里代替了固定命名规则下的个人定制化版本FMs,允许传递更多参数从而适应更广泛的应用需求[^3]。 #### 特殊情况处理 - 使用 @ 符号作为通配符 当涉及到部分匹配或者范围内的多种可能性都需要被考虑到同一个条件之下时,可以巧妙运用 '@' 字符充当通配角色。比如设定键值为 `'12345@'`,那么它实际上涵盖了从 `'123450'` 至 `'123459'`,`'12345a'` 到 `'12345z'` 及其大写字母对应区间还有第六位上任意特殊符号的所有组合情形[^4]。 ### 注意事项 尽管 ABAP 提供了一套完善的解决方案帮助协调并发访问冲突,但在应用层面上仍有许多细节值得重视,例如合理规划粒度大小、及时检测异常状况以及避免长时间持有不必要的占用等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值