SAP LOCK用来处理同一资源的竞争请求,当用户需要修改某些关键数据时应当首先申请lock,并在尽可能早的情况下将其释放以免影响其它用户使用。DB LOCK会随着implicit db commit被释放掉,这样的话对于跨screen的事务就不能满足要求,需要通过sap lock来实现。SAP在application server级别上有一个global lock table可以通过它来实现logical lock。Lock table和相应的enqueue work process只能存在于sap system唯一的一个application server上。这个lock table和work process是system wide的,所有的logical lock请求都在这里处理。还以lock数据库中没有的记录,这适用于如果插入新记录时通过DB LOCK是无法实现的。
通过调用lock module来实现logical lock。这种module是与表相关的特殊的function module,当激活table-related lock object时自动创建。调用这个function module是表中相应的记录就会被logical lock。自定义的lock object的命名空间是EZ或EY。可以为表创建lock object也可以为表及其使用该表的主键作为foreign key的表一块作lock object.Lock module是由系统自动创建的,这个module把lock parameter作为input parameter用来告诉fm那些记录需要设置logical lock。在定义lock object时,还可以定义lock mode(E,X,S),它作为lock module的default parameter值,可以被overwrite。当激活lock object时系统会自动生成两个fm,用来设置和删除logical lock。这两个fm的命名规则分别为:ENQUEUE_,DEQUEUE_。
当call lock function module时,将会在lock table中写入一行。只有在lock table中没有相应的record时才会设置lock。
如果有错误,fm就会trigger相应的exception。这样通过lock module的return code,程序就会知道lock是成功了还是失败了。
根据update bundle technique的不同,应用程序需要自己处理删除所创建的lock entry(inline update)或者自动删除(update task)。
如果application program terminated,那么lock就会自动被释放。Program termination在下列情况发生:
l Message ‘A’ or ‘X’
l Leave program或leave to transaction
l Enter /n in the command field
通过enqueue function的import parameters用来确定那些table entries要被lock,这些parameters被称为lock parameter。通过dequeue来release lock,如果想释放一个没有entry lock的lock,也不会产生任何exception。如果program结束时想释放所有的lock那么可以使用dequeue_all。
Lock entry的核心就是lock parameter指明了要被锁定的表记录。在调用lock module是如果没有给某个parameter赋值那么就会把它作为generic value。Client parameter是个例外,如果没给client输值就会使用当前的client,如果输值,就会在输入的client范围内设置lock,如果输入space则会在所有的client范围了设置lock。可以通过sm12来管理lock table。
Enqueue module的参数:
l Mod_用来设置lock的mode,‘E’exclusive lock(accumulative) ‘X’ exclusive lock(not accumulative) ‘S’shared 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 update‘2’ 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都不会被设置并会重新试着发出请求。可以通过FM:RESET_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)会拒绝其他程序的任何类型的lock,Shared lock会拒绝其他程序的exclusive lock(E X)。在同一个程序对同一个对象不止一次的request lock时:
l 对于一条记录如果存在E lock,E S Lock允许,X lock会被拒绝
l 如果存在X lock,其他lock都会被拒绝
l 对于S lock,E 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/