Appearance
创建锁对象
一、创建的步骤
下面创建由表 ZEMP 的主键构成的锁对象 [图8-5]中的表 ZEMP,ZEMPCERT,ZCERTLEVEL由外部键连接在一起且已经被设置了锁对象。此时锁函数的参数设置成表ZERPCERT的字段EMPNO=00002.CERTID=2 后调用,则由外部键连接在一起的所有数据会被加锁。
二、函数的参数属性
在前面已经提到,激活锁对象会自动生成函数。被创建的函数不能修改且包含此函数的函数组也不能修改。每次修改锁对象后被激活时也自动重新激活相应函数,因此不需要直接修改函数代码。用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数据字典”。
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]所示,下面观察一下分阶段发生的各个作业。
- 第一阶段-首先在 Dialog 程序中有了更新请求,然后把更新信息保存到 Log 表中。
- 第二阶段-在程序内遇到 COMMIT WORK 语句就会执行 Update 操作。
- 第三阶段-从 Log 表中读取 V1 Update 信息。
- 第四阶段-往数据库申请 Update 请求,则分析 Update 执行结果值。日
- 第五阶段-成功执行 V1操作后向数据库提出 COMMIT 请求会删除 Log 表的信息。后续执行 V2 操作,则当成功执行 V2 后一并删除 Log 表的信息。
- 第六阶段-当发生错误,则执行 ROLLBACK 显示错误信息的同时保留 Log 表的信息。
- 第七阶段-当成功结束 V1 Update 操作后执行优先度低的 V2 Update 操作。
- 第八阶段-以 V1 Update 信息为基础从 Log 表中读取 V2 Update 信息。
- 第九阶段-会往数据库请求 V2 Update 操作。然后接收结果进行分析。
- 第十阶段-当发生错误则执行 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函数则所有本地锁控制器中的加/解锁请求都被删除。