Skip to content

创建锁对象

一、创建的步骤

下面创建由表 ZEMP 的主键构成的锁对象 alt text   [图8-5]中的表 ZEMP,ZEMPCERT,ZCERTLEVEL由外部键连接在一起且已经被设置了锁对象。此时锁函数的参数设置成表ZERPCERT的字段EMPNO=00002.CERTID=2 后调用,则由外部键连接在一起的所有数据会被加锁。 alt text

二、函数的参数属性

  在前面已经提到,激活锁对象会自动生成函数。被创建的函数不能修改且包含此函数的函数组也不能修改。每次修改锁对象后被激活时也自动重新激活相应函数,因此不需要直接修改函数代码。用CTS传送锁对象到其他系统时,包含函数的函数组有可能有变动。   下面了解一下[图 8-6]中除了表字段以外的参数属性。

1.Initial Value 参数

  以X <feld>开始的参数会设置字段的初始值(Initial Value)。若设置成XEMP NO=则当遇到与EMP NO的初始值(Initial Value)相同值时才会设置锁对象。EMP NO的'X',初始值只需要在表字段中选择Initial Value选项。当没有设置X时,则会用 Default Value 指定初始值。在[图8-6]中,XEMP NO被设置为Default Value=SPACE.这意味着参数EMP NO中没有指定值时会当成 SAPCE来设置锁对象。关于InitialValue内容请参照“第7章ABAP数据字典”。 alt text

2.Passing Lock 参数

  用户在画面上调用活动执行Dialog事务码,则生成两个锁所有者。一个是 Dialog 所有者1,另一个是Update所有者_2。执行事务码期间所有者1会邀请锁,另外,在程序内用COMMIT WORK语句调用Update操作,则会继承所有者_2拥有的锁功能。参数_SCOPE 起着Passing Lock的功能。_SCOPE 选项只有执行CALL FUNCTION 'FM' IN UPDATE TASK语句时才发挥作用。   正在运行的锁是当调用解锁函数DEQUEUE或者程序结束时(LEAVEPROGRAM或者LEAVE TO TRANSACTION)才被解除。遇到信息类型A和X时或用户在命令窗口中输入了h时也被解除。但是,当事务码正在执行 UPDATE 时结果就不一样了。在这种情况下就要检查SCOPE判断是否可以解除锁。

_SCOPE=1:在UPDATE程序中无法连接锁。当结束事务码时锁也一起结束。即当执行 V1 Update 工作流程时锁记录就被删除。
_SCOPE=2:在UPDATE程序中可以连接锁。在UPDATE程序中负责解锁。是函数 ENQUEUE 的标准设置。往V1Update 作业流程中传达信息,当结束 V2 工作流程时删除锁。
_SCOPE=3:UPDATE程序可以连接锁。调用程序与UPDATE程序通过相互交流进行解锁。是函数 DEQUEUE的标准设置。当执行V1Update作业流程时才会设置锁。当结束 V2 工作流程时也会删除锁。

  要理解 SCOPE选项,则要知道Asynchronous Update 步骤。
  在SAP 系统中,Asynchronous Update操作根据优先顺序分为V1与V2。V1与 V2的执行步骤如[图 8-7]所示,下面观察一下分阶段发生的各个作业。

  1. 第一阶段-首先在 Dialog 程序中有了更新请求,然后把更新信息保存到 Log 表中。 alt text
  2. 第二阶段-在程序内遇到 COMMIT WORK 语句就会执行 Update 操作。
  3. 第三阶段-从 Log 表中读取 V1 Update 信息。
  4. 第四阶段-往数据库申请 Update 请求,则分析 Update 执行结果值。日
  5. 第五阶段-成功执行 V1操作后向数据库提出 COMMIT 请求会删除 Log 表的信息。后续执行 V2 操作,则当成功执行 V2 后一并删除 Log 表的信息。
  6. 第六阶段-当发生错误,则执行 ROLLBACK 显示错误信息的同时保留 Log 表的信息。
  7. 第七阶段-当成功结束 V1 Update 操作后执行优先度低的 V2 Update 操作。
  8. 第八阶段-以 V1 Update 信息为基础从 Log 表中读取 V2 Update 信息。
  9. 第九阶段-会往数据库请求 V2 Update 操作。然后接收结果进行分析。
  10. 第十阶段-当发生错误则执行 ROLLBACK 并保存在 Log 表中。V2 Update 执行成功则向数据库提出 COMMIT 请求并删除 Log表所有信息。   另外,在T-CODE:SM13 中可以确认 Update 请求信息。

3.控制锁参数

COLLECT 参数决定是直接执行加/解锁还是通过Lock Container 执行。

  • Initial Value:加/解锁请求信息直接发送到锁服务器上。
  • X:加/解锁请求首先会存储到本地 Lock Container 中。锁记录信息会累积在控制器中,控制器会成组与锁服务器进行通信。(调用FLUSHENOUEUE函数)。   如[图 8-8]所示,加/解锁请求通过调用FLUSH ENOUEUE函数会累积在控制器中,然后锁控制器会成组与锁服务器进行通信。这种方法有下列两种优点。
  • 锁请求信息成组后进行发送,则可以减少锁服务器的通信负荷。
  • 锁请求信息成组进行管理,因此个别请求会一次性保存到表中。
      内部绘画结束后本地锁控制器的数据会自动被删除。或者调用RESETENQUEUE函数则所有本地锁控制器中的加/解锁请求都被删除。 alt text