关于 SAP ABAP 锁机制的一些疑问和解答

Lock table 的位置

Lock Table 位于 Enqueue Server 的主内存(共享内存)中。

如果 enqueue 服务器作为 enqueue 工作进程安装,则该实例的所有工作进程都可以访问锁表。 外部应用服务器在 enqueue 服务器上的入队过程中执行其锁定操作。

二者的通信,通过相关调度程序(dispatcher)和消息服务器进行。

如果使用独立 enqueue 服务器,则所有工作进程都直接与 enqueue 服务器通信。

服务器重启后,主存里还可能存在锁记录吗?

可能。从 Update task 继承下来的锁,保存到 ABAP 服务器存储介质里,当系统重启时,会被重新加载到 lock table 中。

Enqueue 函数调用完毕之后,系统变量 SY-MSGV1 存放了当前 lock 的 owner 名称。

@ 符号在 SAP 锁(排队)中用作通配符。 换句话说,它可以在锁的冲突检查期间代表任何其他字符。 例如,参数值 12345@ 锁定数量 123450 到 123459、12345a 到 12345z、12345A 到 12345Z,以及第 6 个字符位置中具有任何特殊字符的所有其他值。

为了防止SAP锁在不需要的时候激活通配符机制,需要保证在调用enqueue功能模块时,键值参数不包含任何通配符。

如果要用于锁定单个实体的键值确实包含通配符,则必须在调用 enqueue 函数之前,将通配符替换为不同的字符。

每个 SAP 系统只有一台应用程序服务器充当 enqueue 服务器。 它维护位于共享内存段中的锁表。

enqueue 服务器上的所有工作进程都可以访问锁表。 其他应用程序服务器上的所有工作进程将其上锁请求委托给 enqueue 服务器上的特殊入队工作进程。

该行为是自动配置的。 在默认配置文件 DEFAULT.PFL 中,参数行 rdisp/enqname =<应用程序服务器名称> 告诉开发人员哪个应用程序服务器可用作排队服务器。 当应用程序服务器检测到其名称与排队服务器的名称匹配时,它会创建锁表,并且其所有工作进程都会内联处理排队请求。 如果应用程序服务器检测到其名称与入队服务器的名称不匹配,则会将所有入队请求发送到入队服务器。

排队工作流程保证立即处理传入的请求。 通常一个入队过程就足够了。 在具有许多应用程序服务器的大型 SAP 系统中,第二个进程可能会很有用。 然而,定义两个以上的入队进程并不方便。 如果事务 SM50 CPU 显示仅使用第一个入队进程,则瓶颈是由于其他原因造成的。

你可能感兴趣的:(关于 SAP ABAP 锁机制的一些疑问和解答)