SAP LOCK CONCEPT -LINKS

SAP LOCK用来处理同一资源的竞争请求,当用户需要修改某些关键数据时应当首先申请lock,并在尽可能早的情况下将其释放以免影响其它用户使用。DB LOCK会随着implicit db commit被释放掉,这样的话对于跨screen的事务就不能满足要求,需要通过sap lock来实现。SAPapplication server级别上有一个global lock table可以通过它来实现logical lockLock table和相应的enqueue work process只能存在于sap system唯一的一个application server上。这个lock tablework processsystem wide的,所有的logical lock请求都在这里处理。还以lock数据库中没有的记录,这适用于如果插入新记录时通过DB LOCK是无法实现的。

通过调用lock module来实现logical lock。这种module是与表相关的特殊的function module,当激活table-related lock object时自动创建。调用这个function module是表中相应的记录就会被logical lock。自定义的lock object的命名空间是EZEY。可以为表创建lock object也可以为表及其使用该表的主键作为foreign key的表一块作lock object.Lock module是由系统自动创建的,这个modulelock parameter作为input parameter用来告诉fm那些记录需要设置logical lock。在定义lock object时,还可以定义lock mode(E,X,S),它作为lock moduledefault parameter值,可以被overwrite。当激活lock object时系统会自动生成两个fm,用来设置和删除logical lock。这两个fm的命名规则分别为:ENQUEUE_,DEQUEUE_

    call lock function module时,将会在lock table中写入一行。只有在lock table中没有相应的record时才会设置lock

    如果有错误,fm就会trigger相应的exception。这样通过lock modulereturn code,程序就会知道lock是成功了还是失败了。

    根据update bundle technique的不同,应用程序需要自己处理删除所创建的lock entryinline update)或者自动删除(update task)

    如果application program terminated,那么lock就会自动被释放。Program termination在下列情况发生:

l         Message A or X

l         Leave programleave to transaction

l         Enter /n in the command field

    通过enqueue functionimport parameters用来确定那些table entries要被lock,这些parameters被称为lock parameter。通过dequeuerelease lock,如果想释放一个没有entry locklock,也不会产生任何exception。如果program结束时想释放所有的lock那么可以使用dequeue_all

    Lock entry的核心就是lock parameter指明了要被锁定的表记录。在调用lock module是如果没有给某个parameter赋值那么就会把它作为generic valueClient parameter是个例外,如果没给client输值就会使用当前的client,如果输值,就会在输入的client范围内设置lock,如果输入space则会在所有的client范围了设置lock。可以通过sm12来管理lock table

    Enqueue module的参数:

l         Mod_用来设置lockmode,‘Eexclusive lock(accumulative) X exclusive lock(not accumulative) Sshared lock(accumulative)

l         field value to be used for locking

l         X_ space:lock according to corresponding lock parameter X:lock for table line with initial field value可以锁定有initial value的记录

l         _scope 1 lock remains in program 用于inline update2 lock passed to V1 update(default)用于通过update program实现update 3 lock in program + passed to V1 update These functions are required whenever the update task is triggered for a partial update of a record, but the corresponding total record should still remain locked in the program for further partial updates.

l         _wait space if external lock no further lock attempt X if external lock second lock attempt当第一个lock请求失败时,就发出第二个,可以通过system profile parameter ENQUE/DELAYMAX,来设置不断发送请求的interval

l         _collect space setting lock without local lock container X setting lock with local lock container

在程序中发出一个lock request就会与lock administration交互一次,如果向多个object发出lock request就会与lock administration交互多次。可以通过lock container来减少与lock administration交互的次数,通过parameter _collect = X,lock request就会存储在local container中,直到调用FLUSH_ENQUEUE。所有的lock request发送出去后就会清空整个local container。如果local container中有一个lock不能被set,就会触发exception foreign lock,那么一个lock都不会被设置并会重新试着发出请求。可以通过FMRESET_ENQUEUE删除lock container中的内容。Sap中有三种lock mode

l         Lock Mode E:用来为changing data设置lock,这种lock可以accumulate

l         Lock Mode X:类似Lock Mode E,技术上的区别是这种lock不能accumulate

l         Lock Mode S:用来保证显示的数据不能被修改。

Exclusive locks(E X)会拒绝其他程序的任何类型的lockShared lock会拒绝其他程序的exclusive lock(E X)。在同一个程序对同一个对象不止一次的request lock时:

l         对于一条记录如果存在E lockE S Lock允许,X lock会被拒绝

l         如果存在X lock,其他lock都会被拒绝

l         对于S lockE S lock允许,X lock会被拒绝。

Lock周期的一般步骤;

l         为要处理的数据设置lock

l         如果lock设置成功,从数据库中读取当前数据

l         就修改后的数据更新到数据库中

l         释放lock

这样不仅保证了对数据的修改都是在sap lock保护下进行的,而且也保证了你读取可能会被其他program修改的数据也是一致的。当然前提条件是其他程序也遵循上面的步骤。如果不遵循lock->read->change->unlock的步骤,就很有可能造成数据的不一致。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10350860/viewspace-683619/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10350860/viewspace-683619/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值