在 SAP 帮忙文档里有对于 ABAP lock 反对的全副类型和阐明,总共反对四种类型的锁:S, E, X 和 O.
留神 E 锁和 X 锁的区别是,E 锁
能够在 同一个
事务里屡次被申请,但 X 锁
即便在 同一个
事务里,也只能被申请一次。
我在 SAP CRM 零碎里看到 One Order 页面点击 Edit 按钮时,背地应用的 Lock Object 理论是 E_CRM_ORDER
, 这个 object 的 Lock mode 设置的是 Read Lock 即 Share Lock,共享锁:
然而我在 WebClient UI 上点击了 Edit 按钮后,在 SM12 事务码里,看到的 mode 却是 E:排他锁。
在 SE11 里查看 Enqueue Function Module 名称:ENQUEUE_E_CRM_ORDER
设置断点,运行时单步调试,发现传入的参数是 V
:Only conflict check exclusive lock, as with ‘E’
mode 参数传入的 V:
在 ABAP 中,Lock 机制被设计为一个独立的服务,它应用一种叫做 Lock Object 的对象来对须要锁定的数据表和字段进行形容。一个 Lock Object 能够蕴含一个或者多个数据表,这些数据表之间通过外键关系连贯在一起。而后,咱们能够通过调用特定的函数模块来对这个 Lock Object 进行操作,比方 ENQUEUE_<lock object>
(申请设置锁)和 DEQUEUE_<lock object>
(申请开释锁)。
在 ABAP Lock 机制中,Conflict Check 是用来检测和解决锁抵触的过程。当一个用户(或者一个事务)试图对一个曾经被其余用户锁定的数据进行锁定时,就会产生锁抵触。ABAP Lock 服务在收到锁申请后,会首先查看这个申请的 Lock Mode,而后依据曾经存在的锁和申请的 Lock Mode 来决定是否容许这个锁申请。
以一个简略的例子来阐明这个过程。假如咱们有一个 Lock Object ZLOCKOBJ
,它形容了一个数据表 ZTABLE
。用户 A 首先通过调用 ENQUEUE_ZLOCKOBJ
来对 ZTABLE
中的某一行数据设置一个 Exclusive Lock,这个申请被胜利执行,ZTABLE
中的这一行数据被锁定。而后用户 B 也想对 ZTABLE
中的这一行数据设置一个 Exclusive Lock,他也通过调用 ENQUEUE_ZLOCKOBJ
来发送锁申请。这时,ABAP Lock 服务在进行 Conflict Check 时,会发现 ZTABLE
中的这一行数据曾经被用户 A 独占锁定,因而,用户 B 的锁申请会被回绝,用户 B 会收到一个锁抵触的音讯。
ABAP Lock 服务提供了多种 Lock Mode,比方 Exclusive Lock(独占锁),Shared Lock(共享锁)等,这些不同的 Lock Mode 会影响 Conflict Check 的后果。例如,如果用户 A 设置了一个 Shared Lock,那么用户 B 的 Shared Lock 申请就不会被回绝,因为 Shared Lock 容许多个用户同时读取同一份数据,然而不容许批改。
ABAP Lock 机制的设计和实现使得咱们能够在 SAP 零碎中更无效地治理和管制并发操作,保证数据的一致性和完整性。同时,ABAP Lock 机制也提供了一套具体的错误处理和复原机制,让咱们能够更好地解决并发操作中可能呈现的各种问题和谬误。