locking - 实现应用级锁定

标签 locking

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

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

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

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

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

编辑 1

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

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

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

    编辑 2
    添加有关锁定类型的详细信息
    我已经更新了上面的问题陈述以指定有 3 种锁类型
  • 读锁 - 如果所有其他锁都是读或写的,则可以获得
  • 写独占锁 - 如果所有其他锁都被读取,则可以获得
  • 完全排他锁 - 如果此资源上没有锁,则可以获取
  • 最佳答案

    您可能会考虑用于数据库样式锁的附加字段是当前时间。您也可以考虑同意应用程序的任何操作花费的时间不能超过 X 量。

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

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

    关于locking - 实现应用级锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5436021/

    相关文章:

    SQL 锁定范围,竞争条件预防

    c - 当线程同步不重要时,互斥锁的成本如何?

    .net - SQL 服务器 : wait for new row

    c# - 执行 Parallel.For 从 Array 计算数据的正确方法

    Python 3.2 - GIL - 好/坏?

    android - 我如何关闭新 android 版本的锁定屏幕?

    c# - 通过 C# 强制关闭打开的文件

    sql-server - T-SQL 中的悲观锁

    mysql - MariaDB:存储过程中的 SELECT 锁定行

    Java for循环线程锁