实现应用级锁定

And*_*sne 5 locking

我们在我们的应用程序中要求在访问/修改资源之前需要锁定资源,以避免并发操作并保持完整性。由于对资源执行了一系列操作,因此我们决定实现一个应用程序级锁定概念,所有访问资源的组件都必须遵守该概念。

请注意,资源将被多个进程访问/修改,因此同步成为开销。这也是选择应用级锁定的原因之一。

我们想到的实现应用程序级锁定的方法之一是在数据库表中插入和更新条目,该表将包含资源名称、锁类型(将是读锁、写锁或完全排他锁)和有关的信息等列。获取锁的进程。我们选择了数据库表作为一个选项,因为它是唯一一个集中于所有访问资源的进程的组件,但如果有人可以探索其他可能性,那将会很有帮助。

数据库方法的另一个问题是实现必须使用悲观锁定。(我们的应用程序使用 Oracle 作为我们的数据库服务器)。

这个问题的目的是探索实现应用程序级锁定的各种方法。

编辑 1

我提到数据库方法必须实现悲观锁定的原因是因为

  1. 各种应用组件访问/修改的资源由用户在软件中动态添加。因此,将它们的条目始终插入到这个数据库表中也是很丑陋的。
  2. 即使在该表中创建了资源条目,我们何时删除这些条目也会出现问题?

乐观锁定方法本来不错,但我无法考虑如何实现它。

编辑 2 添加有关锁类型的详细信息我已更新上述问题陈述以指定有 3 种锁类型

  1. 读锁 - 如果所有其他锁都是读或写,则可以获得
  2. 写独占锁 - 如果所有其他锁都被读取,则可以获得
  3. 完全排他锁 - 如果此资源没有锁,则可以获得

tam*_*ech 3

您可能会为数据库样式锁考虑的另一个字段是当前时间。您还可以考虑同意应用程序的任何操作所花费的时间不能超过 X 时间。

该建议背后的原因是为了防止出现应用程序崩溃、失去与数据库的连接等以及无法“撤消”锁定的情况。其他应用程序将包括删除陈旧锁并创建新锁的功能。

您可能还希望应用程序插入该列,然后等待一段随机时间,然后尝试再次检查它。这有助于减少应用程序在等待数据库完成其操作时发生资源冲突的可能性。