关于 SAP ABAP Enqueue Function Module 的输入参数 _wait

发布时间 2023-08-17 19:19:26作者: JerryWang_汪子熙

我们查看 ABAP 系统根据 Lock Object 自动生成的 Enqueue Function Module,可以发现它有一个名叫 _wait 的输入参数,默认值为 space

该参数决定了发生锁冲突时的锁行为。

开发人员有以下选择:

  • 初始值:

如果由于存在竞争锁而导致锁定尝试失败,则会触发异常 FOREIGN_LOCK。

  • X:

如果由于存在竞争锁而导致锁定尝试失败,系统会在一定时间后重复锁定尝试。 仅当自第一次锁定尝试以来已经过了一定的时间限制时,才会触发 FOREIGN_LOCK 异常。 等待时间和时间限制由配置文件参数定义。

这里我们可以用一个例子来说明 _WAIT 参数的作用。

假设我们在一个物料管理系统中,用户 A 想要更改物料 M 的价格,同时用户 B 也想要更改物料 M 的价格。物料 M 的价格在数据库中是一个记录,我们使用 Lock Object 来保护这个记录。

如果用户 A 先执行了 Enqueue Function Module,设定了锁,并且还没有执行对应的 Dequeue Function Module 来释放锁。这时候,用户 B 也尝试执行 Enqueue Function Module 来设定锁。

  1. 如果 _WAIT 参数设置为 'X',那么用户 B 的请求不会立即失败,而是会等待用户 A 释放锁。这样可以保证用户 B 的请求最终会成功,但可能需要等待一段时间。
  2. 如果 _WAIT 参数没有设置(或设置为 ' '),那么用户 B 的请求会立即失败,返回一个错误信息,告知用户 B 物料 M 的价格当前正在被其他用户更改。

通过这个例子,我们可以看出 _WAIT 参数的重要性。它允许我们根据具体情况选择是否等待锁变为可用。在一些情况下,我们可能希望立即知道操作是否成功,而不愿意等待。在其他情况下,我们可能希望尽可能地完成操作,即使需要等待一段时间。

需要注意的是,虽然 _WAIT 参数可以让我们选择是否等待,但它并不能解决所有的并发问题。例如,如果两个用户同时更改同一条记录,即使我们使用了 _WAIT 参数,也无法保证两个用户的更改都能被成功应用。这种情况下,我们需要使用其他的并发控制手段来避免死锁。