SAP_锁

一、概览

SAP LUW要求数据库对象的锁定在SAP LUW结束释放,并且该数据库锁要求对所有SAP程序可见。 SAP提供了一个逻辑数据锁定机制,该机制基于系统特定的锁定服务应用服务器中的中心锁定表(即将加锁的信息记入数据库表)。一个ABAP程序在访问数据之前,将希望锁定的数据表关键字发送给该表,因此所有的程序在访问一个数据库表之前必须首先判断该表是否已经被锁定了。
  SAP锁定与数据库物理锁定是不同的,它是一种业务逻辑上的锁定。它不会在物理表上进行加锁,而是将关键字传递给加锁函数,加锁函数会在特定表中加锁信息登记。
  SAP LUW在结束时(提交或回滚),SAP锁定将会隐式解除。

二、SE11创建自定义锁

自定义锁对象必须用EZ或者EY开头,生成的锁对象里只包含一个PRIMARY TABLE,可以包含若干个SECONDARY TABLE,同时会自动生成两个函数来进行锁管理,分别为ENQUEUE_”LOCK OBJECT”、DENQUEUE_”LOCK OBJECT”,其中”LOCK OBJECT”是锁对象的名称。

三、锁模式

三种锁模式:1、S共享;2、E专用累积;3、X专用不累积
区别如下表:

… 允许第二次加锁模式 允许第二次加锁模式 允许第二次加锁模式
第一次枷锁模式 S E X
S 是(是) 否(是) 否(否)
E 否(是) 否(是) 否(否)
X 否(否) 否(否) 否(否)
   括号内为同一程序(即同一事务内)内,括号外为非同一程序内
S共享:本身不需要更改数据,但是希望显示的数据不被别人更改。
E专用累积:当更改数据的时候设置为此模式。
X专用不累积:和E类似,但是不允许累加,完全独占。
1、如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,其他用户不能再对这个锁对象加E、X模式的锁,但是可以加S模式的锁;
2、如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,其他用户不能再对这个锁对象加E、X、S模式的任意一种锁;
3、如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,其他用户不能再对这个锁对象加E、X、S模式的任意一种锁;
4、如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,在这个程序,你还可以再对这个锁对象加S模式的锁,如果没有别的用户对其加S模式的锁,那么你还可以对其加E模式的锁,X模式的不可以;
5、如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,在这个程序,你还可以再对这个锁对象加E、S模式的锁,X模式的不可以;
6、如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,在这个程序,你不可以再对这个锁对象加E、X、S模式的锁。

四、SM12查看锁

五、通用加锁和解锁函数

1、ENQUEUE_E_TABLE/DEQUEUE_E_TABLE,没创建锁对象的时候使用;
2、ENQUEUE_ESFUNCTION/DEQUEUE_ESFUNCTION,没创建锁对象的时候使用;
3、ENQUEUE_ES_PROG/DEQUEUE_ES_PROG,用于控制同一个程序不能并发执行;
4、DEQUEUE_ALL,解同一个程序中创建的所有锁。

六、读锁

函数ENQUE_READ2
ENQUE_READ2

CALL FUNCTION ‘ENQUE_READ2’
EXPORTING
gclient = sy-mandt
gname = ’ ’
guname = ‘*’
TABLES
enq = lt_enq_read.

*We will search entry for table level lock for our table
LOOP AT lt_enq_read INTO lw_enq_read
WHERE gname EQ ‘RSTABLE’
AND ( garg CS ‘EKKO’ OR garg CS ‘ZCG110’ OR garg CS ‘ZCG109’ ).
MOVE-CORRESPONDING lw_enq_read TO lw_enq_del.
APPEND lw_enq_del TO lt_enq_del.
ENDLOOP.

七、删除锁

函数ENQUE_DELETE
*Delete table level lock entry for our table
CALL FUNCTION ‘ENQUE_DELETE’
EXPORTING
check_upd_requests = 1
IMPORTING
subrc = lv_subrc
TABLES
enq = lt_enq_del.

猜你喜欢

转载自blog.csdn.net/weixin_42921800/article/details/83030137
SAP