前面我们在
SAP锁学习了如何实现锁,今天 我们来看看实现锁的原理。
一,SAP为什么要设置锁:
1,保持数据的一致性:如果几个用户要访问同样的资源,需要找到一种同步访问的方法去保持数据的一致性,比如说,在订火车票时,需要检查有没有座位,当检查的时候,我们希望数据不要被修改。
2,仅仅用Database锁是不够的,数据库管理系统物理锁定了要修改的行记录,其他用户要等到数据库锁释放了才能访问这个记录。
在SAP系统中,当一个新屏幕显示的时候会释放掉Database锁,因为屏幕的改变会触发一个隐式的DB COMMIT。如果数据从好几个屏幕收集来的话,而且在这段时间内这些数据会分别被锁定,仅仅用Database锁就不够了。
SAP系统在应用服务器层面有一个全局的LOCKTABLE,可以用来设置逻辑锁来锁定相关的表条目,并有ENQUEUE工作进程来管理这些锁。SAP锁是一种逻辑意义上的锁,有可能你锁定的表条目在DATABASE上根本就不存在。
二,锁对象和其对应的Function Module
在SE11里创建锁对象,自定义的锁对象都必须以EZ或者EY开头来命名。一个锁对象里只包含一个PRIMARY TABLE,可以包含若干个SECONDARY TABLE,锁的模式有三种:E,S,X。LOCK PARAMETERS里填写你要根据哪些字段来锁定表条目。
E:当更改数据的时候设置为此模式。
S:本身不需要更改数据,但是希望显示
X:与E类似,但是不允许累加,完全独占
1,如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,其他用户不能于对这个锁对象加E,X,S模式的任何一个。
2,如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,其他用户不能于对这个锁对象加E,X,S模式的任何一个。
3,如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,他用户不能于对这个锁对象加E,X。但是可以加S模式的锁。
4,如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,在这个程序,你还可以再对这个锁对象加E,S模式的锁,X模式不可以。
5,如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,在这个程序,不能于对这个锁对象加E,X,S模式的任何一个。
6,如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,在这个程序,你还可以再对这个锁对象加S模式的锁,如果没有别的用户加S模式的锁,那么你还可以对其加E模式的锁,但不能加X模式。
当激活锁对象的时候,系统会自动创建两个函数,ENQUEUE_<锁对象名>和DEQUEUE_<锁对象名>,分别用来锁定和解锁。
三,锁定和解锁
当用逻辑锁来锁定表条目的时候,系统会自动向LOCK TABLE中写入记录。
当调用设置锁的函数时,LOCK PARAMETERS如果没有指明,系统会锁定整个表。当然,LOCK PARAMETE:CLIENT有点特殊,如果不指定,默认是SY-MANDT,如果指定相应的CLIENT,会锁定对应CLIENT上的相应的表记录。如果设置为SPACE,刚锁定涉及所有的CLIENT。
当逻辑锁设置失败后,一般会有两种例外。一个是EXCEPTION:FOREIGN_LOCK,意思是已经被锁定,另一个是EXCEPTION:SYSTEM_FAILURE。
有些情况下,程序中设置成功的逻辑锁会隐式的自已解锁。比如说程序结束发生的时候(MESSAGE TYPE为A或X的时候),使用语句LEAVE PROGRAM,LEAVE TO TRANSACTION,或者在命令行输入/n回车以后。
在程序的结束可以用DEQUEUE FUNCTION MODULE来解锁(当然如果你不写这个,程序结束的时候也会自动的解锁),这个时候,系统会自动从LOCK TABLE把相应的记录删除。使用DEQUEUE FUNCTION MODULE来解锁的时候,不会产生EXCEPTION。要解开你在程序中创建的所有逻辑锁,可以用FM: DEQUEUE_ALL.
四,上锁的一般步骤