锁对象(lock object)

来源:互联网 发布:ios手游推荐 知乎 编辑:程序博客网 时间:2024/05/16 00:29

如有转载请注明出处:http://blog.csdn.net/donkey2004112103/archive/2009/04/28/4131496.aspx

ABAP里为了控制并发,保持数据一致性,用了锁对象(lock object)对于abaper来说使用起来非常方便,没有什么难度,很好的处理了并发的状况。下面先介绍如何使用.这里的锁对象是逻辑意义上的锁,可能你锁定的条目在表里根本不存在。

1.如何创建锁对象

创建锁对象很容易,TCODE:se11.选择最下面的lock object。如图:

image

自建的锁对象以EZ或者EY开头,新建完之后可以看到三个标签页。Attributes,Tables,Lock Parameter.

如果是接口对表进行操作,注意需要选上allow RFC.如图:

image

Tables标签下Primary Tables下两个输入项,name是表的名字,lock mode有三种模式,分别是S,E,X.含义如下:

  •       S (Shared lock, read lock)
  •       E (Exclusive lock, write lock)
  •       X (eXclusive lock, extended write lock, cannot be cumulated)

 

如果我们使用一般情况下,E就可以了。

  •  
    •      如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,其他用户不能再对这个锁对象加E、X、S模式的任意一种锁;
  •     如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,其他用户不能再对这个锁对象加E、X、S模式的任意一种锁;
  •     如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,其他用户不能再对这个锁对象加E、X模式的锁,但是可以加S模式的锁;
  •     如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,在这个程序,你还可以再对这个锁对象加E、S模式的锁,X模式的不可以。
  •     如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,在这个程序,你不可以再对这个锁对象加E、X、S模式的锁。
  •     如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,在这个程序,你还可以再对这个锁对象加S模式的锁,如果没有别的用户对其加S模式的锁,那么你还可以对其加E模式的锁。X模式的不可以。

image

LOCK parameters里面默认的参数时表的主键,这样因为可以唯一的确定表的一行,通常情况下不用修改。

在激活之后,会产生两个function module,一个用来对对象进行锁定,另一个是释放对象。二者的名字都很有规律。

DEQUEUE_<lock object的名字>               释放对象 EZ9MISTP 的锁定
     ENQUEUE_<lock object的名字>                对象 EZ9MISTP 要求的锁定

到时要使用的时候直接call function module即可。

2.常见问题

  •  
    •       2.1 如果出现问题怎么办?

可以通过TCODE:SM12去诊断。可以去手工删除相关的锁定。

2.2如何在程序里判断谁对锁对象加锁?

调用ENQUEUE_.后SY-MSGV1返回的就是所的拥有着。

2.3The Syslog often contains messages such as "Enqueue: total wait time during locking: 2500 seconds". How should I analyze this problem? Or is the entry not critical? (There are no records of terminations or timeouts.)

The message is output for information purposes only but may indicate parallel processing errors with ABAP programs. The specified wait time is the time that has elapsed since startup due to the use of the WAIT parameter when the enqueue function module was called.

The WAIT parameter enables a lock attempt to be repeated a number of times, for example, so that the update task does not have to be cancelled when a lock is set temporarily by other programs. The work process remains busy between the lock attempts.