1.SAP ABAP 实现数据库表行项目加解锁功能
实现效果:
当一个数据库表以某字段为关键字段的数据被锁定时,同一时间其他程序无法修改改表内被锁定的数据,除非被解锁或退出程序。
1.事务代码:SE11 创建锁对象。PS:命名要以 “EZ” 开头。
2.添加描述,属性选择允许RFC。
3.添加需要加锁的表名
锁模式选择 E写入锁 模式
模式有三种具体属性如下:
● E:专用、积累,被锁定的数据只能被一个用户来读取,不允许其他用户进行锁操作。一般主数据的锁定都会使用该类型。
● S:共享。本身不需要修改,但是在读取数据时不允许该数据被其他用户以E或者X的模式来进行修改,允许被锁定数据被多个用户以S模式来读取。
● X:专用,不累计。与E模式类似,在某用户对该数据加入了X类型的锁定后,本用户可以继续为该数据添加E或者S模式的锁。
4.选择表的关键字段作为锁定参数。
5.SE37 通过锁对象名字前后加 * 搜索方法名:EZLOCK_TEST
会出现加锁和解锁两个函数方法
加锁代码:
"加锁
CALL FUNCTION 'ENQUEUE_EZLOCK_TEST'
EXPORTING
mode_vbak = 'E'
mandt = sy-mandt
id = it_main-id
name = it_main-name
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
CONCATENATE '订单锁定失败!用户' sy-msgv1 '正在编辑!' INTO
it_main-message.
ELSE.
ENDIF.
解锁有两种方式:1.退出程序时系统会自动解除锁定状态。2.调用解锁方法
解锁
CALL FUNCTION 'DEQUEUE_EZLOCK_TEST'
EXPORTING
mode_zdbgz = 'E'
id = it_main-id
name = it_main-name
_scope = '3'
_synchron = ' '
_collect = ' '.
COMMIT WORK.
2.通用表加解锁
锁定整个表数据
CALL FUNCTION 'ENQUEUE_E_TABLE'
EXPORTING
* MODE_RSTABLE = 'E'
tabname = 'ZMMTEST'
* VARKEY =
* X_TABNAME = ' '"标示参数tabname是否是十六进制的
* X_VARKEY = ' '"标示参数VARKEy是否是十六进制的
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
CALL FUNCTION 'DEQUEUE_E_TABLE'
EXPORTING
* MODE_RSTABLE = 'E'
tabname = 'ZMMTEST'
* VARKEY =
* X_TABNAME = ' '
* X_VARKEY = ' '
* _SCOPE = '3'
* _SYNCHRON = ' '
* _COLLECT = ' '.
3.程序锁
对于一些重要的程序,可能会要求处理并发的情况,在有用户操作的情况下不允许其他用户进行操作,以此来保证数据及程序的安全。
CALL FUNCTION 'ENQUEUE_ES_PROG'
EXPORTING
MODE_TRDIR = 'E' "锁条目模式:默认是E锁又叫独占锁,可选‘S’锁又叫共享锁,‘X’锁又叫专用锁
NAME = 'Z_PROGLOCK' "需要锁定的程序名
X_NAME = ' ' "默认为空,可选
_SCOPE = '2' "表示锁定范围值,默认为‘2’,表示在update module内有效;其它参数有‘1’,表示程序内有效;‘3’表示全部
_WAIT = ' ' "表示如果对象已经被锁定,是否等待后再尝试加锁,最大的等待时间有系统参 数 ENQUE/DELAY_MAX控制
_COLLECT = ' '