Skip to content

概要

一、锁原理介绍

  数据库管理系统(DBMS)如[图8-1]所示,当有数据变更邀请时会为表数据设置锁对象。再次访问此数据的用户要等到这个锁被解为止。另外,到DB COMMIT执行的DB LUW的最后阶段 DBMS 会解开设置的锁对象。 alt text

二、锁对象使用

  在SAP R/3系统中,每当结束一个画面时内部自动会执行DB COMMIT,因此每个画面都需要设置锁与解锁的操作。因为自动执行COMMIT,因此叫Implicit COMMIT。数据库级别的锁对象无法提供给需要修改多个画面数据的工作的SAP充分的机制。数据库级别上的Lock 设置无法为在多个屏幕修改数据的SAP提供充分的机制。因此在这种背景下导入了SAP锁对象。在 DBMS 里设置锁,则执行UPDATE等对数据库进行操作时自动执行。但是SAP锁对象只有在每个程序都设置解除锁对象语句时才会有效。另外,当用户执行程序访问数据 时要添加判断是否设置了锁对象的代码。

三、创建/变更/查询概述

  锁对象是在 T-CODE:SE11 中可以创建/变更/査询的 ABAP 对象,起着同期化数据的作用使多个程序同时访问数据。如[图8-2]所示,当“程序1”修改数据时使“程序2”不能访问数据。这时“程序1”会给相应数据加锁。   锁运行机构提供如下所示的两个主要功能。

  • 当程序读取数据变更后向其他程序传达已经结束的消息。
  • 防止程序读取正在被别的程序修改中的数据。   要设置锁的前提是在 ABAP数据字典中应该存在此锁对象。当激活锁对象时自动生成加锁/解锁用的下列两个函数。
abap
ENOUEUE <LockObjectname>
DEOUEUF,<ockObiectname>

四、加锁的步骤

如[图 8-3]所示,按下列步骤给表加锁。

  • 1. 要求锁: 在程序中邀请给数据加锁。被锁的表记录根据逻辑性条件(logicalcondition)进行管理
  • 2. 进入锁: 要加锁的数据加锁条件输入到锁表中。
  • 3. 设置锁: 当程序要求时才给表加锁。加锁状态会保持到程序中遇到解锁或者程序结束。所有锁都在程序内部进行加锁,因此应该都在程序内部进行解锁。当程序访问已经加锁的数据时该邀请信息会存储到锁表中。为了正- **1. 确设置要操作的数据,锁对象最好选择根据表主键区分的方式。[图8-3]说明当调用加锁函数时会加到符合条件的所有数据中。 alt text
  • 4. 访问数据:
      只有在设置了锁的程序中才能访问该数据。
      在[图 8-4]中,给表 ZEMPCERT 创建锁对象,则自动生成加/解锁此表的函数。另外,在程序中调用此函数,则EMPNO字段等于0001的数据被加锁。这样,为了要使这种设置有效就需要每个程序的配合。没有设置锁的状态下,若修改数据会发生数据不一致现象。还有当设置锁的情况下,若其他程序要访问此数据时就要申请解锁请求。根据锁定模式可以接收或者拒绝其他系统的解锁请求。

锁定模式的解释如下。

E-独占锁:只允许一个用户访问表。对其他程序的独占锁及共享锁不起作用。
S-共享锁:多个用户可以同时读取数据。但是,倘若有个用户在修改数据,则其他用户就无法再访问数据了。另外,对其他用户使用的共享锁起作用,但是对独占锁是不起作用的。
  X-独占锁但不是累计锁(Exclusive butnot cumulativelock):独占锁可以在多个不同事务码内申请锁。但是在相应事务码中只能申请一次,此外不接收其他任何锁申请。

alt text