SAP ABAP Lock 的 Collision Check 机制介绍

SAP ABAP 系统使用 Collision Check 机制来检查锁请求是否与现有锁冲突。

如果发生冲突,对话事务的用户会收到一条消息,指示所请求的对象当前已被不同的用户锁定。

注意:对于非对话工作进程(在批量输入中),稍后会再次发出锁定请求。

SAP 官方文档中对 collision check 机制的描述:

There are two steps when checking if a lock request collides with an existing lock: First, the system checks if the lock request collides with an elementary lock in the lock table. If this is the case, the system checks if there is an owner collision. (The same owner may, for example, request a write lock more than once. This is described in Lock Cumulation.)

由此可见,collision check 流程分为两个步骤。

  1. 系统检查锁请求是否和 lock table 中的 elementary lock 产生了冲突。

  2. 如果确实产生了冲突,再检查当前 lock request 是否和 lock table 里的条目产生了 owner collision.

之所以要检查 owner collision,是因为同样的 owner 有可能重复提交写锁请求(write lock request).

如果发生冲突,对话事务的用户会收到一条消息,指示所请求的对象当前已被其他用户锁定。

对于非对话工作进程(在批量输入中),稍后会再次发出锁定请求。

如果满足以下所有条件,则我们称两个 Elementary Lock 发生冲突:

  1. 基本锁(要锁定的表)的名称是相同的。

  2. 锁参数:锁参数是相同的。 每个位置的字母都匹配(这里用@表示的通配符字母对于所有字母都是相同的)。

  3. 至少有一个基本锁不处于读锁定状态。

下图是一些具体的例子。

第三个锁请求,因为请求的是读锁,而 lock table 里也是读锁,因此不存在锁冲突的情况。

第四行 lock table 里已经有 S 即读锁存在,此时试图上一个写锁,E,会失败。

猜你喜欢

转载自blog.csdn.net/i042416/article/details/132254933