【问题标题】:Oracle global lock across processOracle 跨进程全局锁
【发布时间】:2011-02-01 08:20:05
【问题描述】:

我想同步对特定插入的访问。因此,如果多个应用程序执行这个“一个”插入,则插入应该一次发生一个。同步背后的原因是该实体应该只有一个实例。如果多个应用程序尝试插入同一个实体,则只有一个应用程序成功,其他应用程序失败。 考虑的一种选择是创建一个复合唯一键,该键将唯一标识实体并依赖唯一约束。由于某些原因,dba 部门拒绝了这个想法。我想到的另一个选项是为插入创建一个存储过程,如果存储过程可以获得全局锁,那么多个应用程序调用相同的存储过程,尽管在它们单独的数据库会话中,预计存储过程可以获得全局锁并因此序列化插入。 我的问题是,在 oracle 版本 10/11 中的存储过程是否有可能获得这样的锁,并且任何指向文档的指针都会有所帮助。

【问题讨论】:

  • 我无法想象为什么 DBA 组说“不要使用唯一约束来序列化对一组列的访问”,因为这是拥有唯一约束的主要原因之一。我能想到的唯一原因是,如果会话 A 插入一行阻塞会话 B、C 和 D,会话 B-D 将挂起,等待会话 A 提交或回滚阻塞语句。或者,断言您需要唯一索引来保持数据一致性,这样他们就没有立足之地了。

标签: stored-procedures oracle10g locking oracle11g


【解决方案1】:

如果您希望插入的实体是唯一的,那么在 Oracle 中您不需要序列化任何内容 - 唯一约束经过完美设计并适合此目的。 Oracle 处理所有需要的锁定以确保只插入一个实体。

我想不出为什么 dba 部门拒绝了唯一约束的想法,这是非常基本的 - 也许他们拒绝了您提出的解决方案的其他方面。

如果您出于某种原因想要对访问进行序列化(我想不出您这样做的原因),您可以 (a) 锁定整个表,这将序列化表上的所有 DML;或 (b) 使用 DBMS_LOCK 获得一个用户命名的锁 - 这只会序列化您获得锁的特定进程。这两种选择各有利弊。

【讨论】:

    猜你喜欢
    • 2010-10-02
    • 1970-01-01
    • 2011-07-16
    • 2016-06-16
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多