实现应用程序级锁定

时间:2011-03-25 17:31:23

标签: locking

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

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

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

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

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

修改1

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

  1. 由各种应用程序组件访问/修改的资源由用户在软件中动态添加。因此,总是在这个数据库表中插入它们的条目也很难看。
  2. 即使在此表中创建了资源条目,也会出现何时删除这些条目的问题?
  3. 乐观锁定方法本来不错,但我无法思考如何实施它。

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

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

1 个答案:

答案 0 :(得分:2)

您可能考虑用于数据库样式锁定的其他字段是当前时间。您也可以考虑同意申请中的任何操作都不会超过X个时间。

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

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