SAP 为什么要设置锁
保持数据的一致性
同时多个用户操作同一数据,防止数据出现不一致性而采用了锁机制。一般 sap 会在操作数据前设置锁,防止第二个用户进行修改操作,当操作结束后系统在释放锁。
仅仅用 Database 锁是不够的
数据库锁定:与 DB LUW 机制类似,数据库本身一般也提供数据锁定机制。数据库将当前正在执行修改操作的所有数据进行锁定,其他用户要等到数据库锁释放才能访问这个记录。该锁定将随着数据库的 LUW 的结束而被重置,因而每当数据库提交或者回滚之后该锁定就被释放。因为 SAP 的 LUW 概念独立于数据库 LUW 和对话步骤,出于同样的原因,SAP 还需要定义自己的数据锁定机制。
SAP 锁定:在 SAP 系统中,当一个新屏幕显示的时候会释放掉 Database 锁,因为屏幕的改变会触发一个隐式的 DB COMMIT。如果数据是从好几个屏幕收集来的话,而且在这段时间内这些数据会分别被锁定,仅仅用 Database 锁就不够了。
SAP提供了一个逻辑数据锁定机制,SAP 系统在应用服务器层面有一个全局的 LOCK TABLE,可以用来设置逻辑锁来锁定相关的表条目,并有 ENQUEUE 工作进程来管理这些锁。一个ABAP程序在访问数据之前,将希望锁定的数据表关键字发送给该表,因而所有的程序在访问一个数据库表之前必须首先判断该表是否已经被锁定了。
SAP 锁定与数据库物理锁定是不同的,它是一种业务逻辑上的锁定。它不会在物理表上进行加锁,而是将关键字传递加锁函数,加锁函数会在特定表中进加锁信息登记。
SAP LUW 在结束时(提交或回滚),SAP 锁定将会隐式解除。
锁对象之程序锁
CALL FUNCTION ‘ENQUEUE_ES_PROG’
- EXPORTING
- MODE_TRDIR = ‘E’
- NAME =
- X_NAME = ’ ’
- _SCOPE = ‘2’
- _WAIT = ’ ’
- _COLLECT = ’ ’
- EXCEPTIONS
- FOREIGN_LOCK = 1
- SYSTEM_FAILURE = 2
- OTHERS = 3
-
create a Table ZRUNNING_LOCK (tcode:se11)
fields: MANDT , PROGNAME -
create Lock object EZRUNLOCK (tcode:se11)
短文本 程序运行锁 -
如果需对程序加锁,则在程序中执行
perform do_lock -
如果需对程序解锁,则在程序中执行
perform release_lock
3.SAP ABAP 给程序加锁,防止重复运行
有的程序需要现在同一时间只能运行一个,这种需求可以用锁的方式来实现,在START-OF-SELECTION 事件后加锁,如果是加锁成功,说明还没有程序在执行,如果是加锁失败,则说明已经有同名程序在运行,报错即可。
注:这个锁是借用程序修改的锁,在SE38修改程序的时候也会加这个锁。
**START-OF-SELECTION.
CALL FUNCTION 'ENQUEUE_ESRDIRE'
EXPORTING
name = sy-repid
_scope = '1'
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
"说明已经有程序在运行了。
ENDIF.**
锁对象之表锁