一、SAP为什么要设置锁:1,保持数据的一致性如果几个用户要访问同样的资源,需要找到一种同步访问的方法去保持数据的一致性。比如说,在航班预订系统中,需要检查还有没有空座位,当检查的时候,你不想别人修改重要的数据(空座位的数量)。2,仅仅用Database锁是不够的数据库管理系统物理锁定了要修改的行记录,其他用户要等到数据库锁释放才能访问这个记录。在SAP系统中,当一个新屏幕显示的时候会释放掉Database锁,因为屏幕的改变会触发一个隐式的DBCOMMIT。如果数据是从好几个屏幕收集来的话,而且在这段时间内这些数据会分别被锁定,仅仅用Database锁就不够了。SAP系统在应用服务器层面有一个全局的LOCKTABLE,可以用来设置逻辑锁来锁定相关的表条目,并有ENQUEUE工作进程来管理这些锁。SAP锁是一种逻辑意义上的锁,有可能你锁定的表条目在DATABASE上根本就不存在。二、锁对象和其对应的FM在SE11里创建锁对象,自定义的锁对象都必须以EZ或者EY开头来命名。一个锁对象里只包含一个PRIMARYTABLE,可以包含若干个SECONDARYTABLE,锁的模式有三种:E,S,X。LOCKPARAMETERS里填写你要根据哪些字段来锁定表条目。模式E:当更改数据的时候设置为此模式。模式S:本身不需要更改数据,但是希望显示的数据不被别人更改。模式X:和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模式的不可以。当激活锁对象的时候,系统会自动创建两个FM,ENQUEUE_锁对象名和DEQUEUE_锁对象名,分别用来锁定和解锁。三、锁定和解锁当用逻辑锁来锁定表条目的时候,系统会自动向LOCKTABLE中写入记录。当调用设置锁的FM时,LOCKPARAMETERS如果没有指明,系统会锁定整个表。当然,LOCKPARAMETER:CLIENT有点特殊,如果不指定,默认是SY-MANDT;如果指定相应的CLIENT,会锁定对应CLIENT上的相应的表记录;如果设置为SPACE,则锁定涉及所有的CLIENT。当逻辑锁设置失败后,一般会有两种例外。一个是EXCEPTION:FOREIGN_LOCK,意思是已经被锁定了;另一个是EXCEPTION:SYSTEM_FAILURE。有些情况下,程序中设置成功的逻辑锁会隐式的自己解锁。比如说程序结束发生的时候(MESSAGETYPE为A或者X的时候),使用语句LEAVEPROGRAM,LEAVETOTRANSACTION,或者在命令行输入/n回车以后。在程序的结束可以用DEQUEUEFUNCTIONMODULE来解锁(当然如果你不写这个,程序结束的时候也会自动的解锁),这个时候,系统会自动从LOCKTABLE把相应的记录删除。使用DEQUEUEFUNCTIONMODULE来解锁的时候,不会产生EXCEPTION。要解开你在程序中创建的所有的逻辑锁,可以用FM:DEQUEUE_ALL.四、上锁的一般步骤先上锁,上锁成功之后,从数据库取数据,然后更改数据,接着更新到数据库,最后解锁。按照这个步骤,才能保证更改完全运行在锁的保护机制下。sap为了同步同时多个用户操作同一数据,防止数据出现不一致性而采用了锁机制。一般sap会在操作数据前设置锁,防止第二个用户进行修改操作,当操作结束后系统会自动释放锁(当然程序也可以调用解锁函数去解锁)。1、SAP锁的类型1)ExclusivelockThelockeddatacanbereadorprocessedbyoneuseronly.Arequestforanotherexclusivelockorforasharedlockisrejected.2)SharedlockSeveraluserscanreadthesamedataatthesametime,butassoonasausereditsthedata,asecondusercannolongeraccessthisdata.Requestsforfurthersharedlocksareaccepted,eveniftheyareissuedbydifferentusers,butexclusivelocksarerejected.3)ExclusivebutnotcumulativelockExclusivelockscanberequestedbythesametransactionmorethanonceandhandledsuccessively,butanexclusivebutnotcumulativelockcanonlyberequestedoncebyagiventransaction.Allotherlockrequestsarerejected.2、TCODE、相关表、多表锁1)TCODE:可以通过se11来查看和创建锁对象,锁对象创建完毕之后,统会自动创建两个FM,ENQUEUE_锁对象名和DEQUEUE_锁对象名,分别用来锁定和解锁。2)相关表:DD25L:组合标题(方式,MC目标,锁定目标)(纪录了锁主表);DD25T:DD26S:视图的基本表和外来码关系(纪录了所有和锁相关的表);DD27S:合计(视图,MC对象,锁定对象)字段;3)多表锁在SE11里创建锁对象,自定义的锁对象都必须以EZ或者EY开头来命名。一个锁对象里只包含一个PRIMARYTABLE,可以包含若干个SECONDARYTABLE。如多表锁:EMEKKOE,主表:EKKO--E专用累积,从表:EKPO--E专用累积。3、锁的生命周期通常程序一运行就要对特殊记录进行ENQUEUE处理,程序运行完毕之后进行DEQUEUE处理(不显示处理的话,关闭该session的时候,sap会自动DEQUEUE,此处sap真N!)。4、锁的作用范围sap锁仅对特定程序起作用,假设A程序改table1的第1条记录,B程序也改table1的第1条记录,A程序一运行就对table1的第1条记录加锁,B程序则未加锁,则B程序仍可以改table1的第1条记录内容。