咱们查看 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 来设定锁。
- 如果 _WAIT 参数设置为 ‘X’,那么用户 B 的申请不会立刻失败,而是会期待用户 A 开释锁。这样能够保障用户 B 的申请最终会胜利,但可能须要期待一段时间。
- 如果 _WAIT 参数没有设置(或设置为 ‘ ‘),那么用户 B 的申请会立刻失败,返回一个错误信息,告知用户 B 物料 M 的价格以后正在被其余用户更改。
通过这个例子,咱们能够看出 _WAIT 参数的重要性。它容许咱们依据具体情况抉择是否期待锁变为可用。在一些状况下,咱们可能心愿立刻晓得操作是否胜利,而不违心期待。在其余状况下,咱们可能心愿尽可能地实现操作,即便须要期待一段时间。
须要留神的是,尽管 _WAIT 参数能够让咱们抉择是否期待,但它并不能解决所有的并发问题。例如,如果两个用户同时更改同一条记录,即便咱们应用了 _WAIT 参数,也无奈保障两个用户的更改都能被胜利利用。这种状况下,咱们须要应用其余的并发管制伎俩来防止死锁。