一、锁机制
SAP LUW要求数据库对象的锁定在SAP LUW结束释放,并且该数据库锁要求对所有SAP程序可见。SAP提供了一个逻辑数据锁定机制,该机制基于系统特定的锁定服务应用服务器中的中心锁定表(即将加锁的信息记入数据库表)。一个ABAP程序在访问数据之前,将希望锁定的数据表关键字发送给该表,因此所有的程序在访问一个数据库表之前必须首先判断该表是否已经被锁定了。
SAP锁定与数据库物理锁定是不同的,它是一种业务逻辑上的锁定。它不会在物理表上进行加锁,而是将关键字传递给加锁函数,加锁函数会在特定表中加锁信息登记。
SAP LUW在结束时(提交或回滚),SAP锁定将会隐式解除。
Lock objects are used to lock the database table while making the modifications on the database table. sap为了同步同时多个用户操作同一数据,防止数据出现不一致性而采用了锁机制。一般 sap会在操作数据前设置锁,防止第二个用户进行修改操作,当操作结束后系统会自动释放锁(当然程序也可以调用解锁函数去解锁)。
SAP为什么要设置锁:
1,保持数据的一致性
如果几个用户要访问同样的资源,需要找到一种同步访问的方法去保持数据的一致性。比如说,在航班预订系统中,需要检查还有没有空座位,当检查的时候,你不想别人修改重要的数据(空座位的数量)。
2,仅仅用Database锁是不够的
数据库管理系统物理锁定了要修改的行记录,其他用户要等到数据库锁释放才能访问这个记录。
在SAP系统中,当一个新屏幕显示的时候会释放掉Database锁,因为屏幕的改变会触发一个隐式的DB COMMIT。如果数据是从好几个屏幕收集来的话,而且在这段时间内这些数据会分别被锁定,仅仅用Database锁就不够了。
SAP系统在应用服务器层面有一个全局的LOCK TABLE,可以用来设置逻辑锁来锁定相关的表条目,并有ENQUEUE工作进程来管理这些锁。SAP锁是一种逻辑意义上的锁,有可能你锁定的表条目在DATABASE上根本就不存在。
二、加锁解锁的思路/步骤
程序设计思路:先上锁,上锁成功之后,从数据库取数据,然后更改数据,接着更新到数据库,最后解锁。按照这个步骤,才能保证更改完全运行在锁的保护机制下。
加锁维度:可以针对整个程序加锁,比如后台JOB程序,前一个没有执行完成,后一个不能启动。可以针对不同公司代码或不同的单据ID等加锁,根据不同业务场景需要确认锁的颗粒度。
三、建锁对象
在SE11里创建锁对象,自定义的锁对象都必须以EZ或者EY开头来命名。
新建完之后可以看到三个标签页。Attributes,Tables,Lock Parameter.
如果是接口对表进行操作,注意需要选上allow RFC.如图:
四、锁类型
独占锁:可写锁,一个用户正在修改数据时,阻止其他用户更改该数据。
共享锁:只读锁,一个用户正在读数据时,阻止其他用户更改该数据。
Exclusive lock: The locked data can only be displayed or edited by a single user.
A request for another exclusive lock or for a shared lock is rejected.
Shared lock: More than one user can access the locked data at the same time in display
mode. A request for another shared lock is accepted, even if it comes from another user.
An exclusive lock is rejected.
Exclusive but not cumulative: Exclusive locks can be requested several times from the
same transaction and are processed successively. In contrast, exclusive but not
cumulative locks can be called only once from the same transaction. All other lock
requests are rejected.
五、锁方式
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模式
括号内为同一程序(即同一事务内)内,括号外为非同一程序内