2012-12-12 44 views
2

我们有一个由Oracle进程P1访问的表TAB1(例如SID = 123)。该进程需要动态SQL删除,然后提交。表上的锁定机制

由SID = 123启动的进程P1由除TAB1相关操作以外的很多操作组成。

场景:

  • SID = 123是活动的; P1对TAB1施加了一个行独占锁(从查询locked_object视图获得)。

  • 另一个oracle进程P2在SID = 124(与P1完全相同,但是对于不同的数据输入集合)之后,在P1启动后的某个时间(比如说2-3分钟)开始启动。

  • SID = 124正在等待,直到由SID = 123启动的进程P1完成; P2对TAB1施加了行独占锁(从查询locked_object视图获取)。

问:

我认为P2相同的行级锁预期由P1行级锁“能够反超”。 我们能否手动取代TAB1上的进程P1所施加的锁定(我希望可以),并在TAB1上的操作结束后释放锁定?这是否有助于减少P2在TAB1上现有的长时间等到整个P1结束?

任何建议将不胜感激。请让我知道你是否需要更多的信息。

+2

您的描述非常低级,并侧重于当前的实施及其问题。它没有提供任何关于你真正想要达到的信息。如果您在更高级别和更多上下文信息中描述您的任务,则更有可能获得有用的答案和良好的解决方案。 – Codo

+0

@Codo:我希望以下描述是好的?一个表由于同时的oracle进程而被锁定,我们希望一个进程应该等待,直到下一个进程对该表的操作处于活动状态;不要等到第一个过程完成。 – Lakshman

+1

@codo的建议是,如果你发布了你正在尝试实现的目标,可能会想出一个完全不同的解决方案,这是你没有考虑过的。 – Ben

回答

0

锁上释放交易边界,而不是过程边界。

简而言之,如果您希望P1立即释放锁,则P1必须在删除操作之后以显式提交或回滚结束当前传输。

当然,结束事务也会提交/回滚在上次提交/回滚之后在同一会话中执行的其他操作。如果这是一个问题,您必须重新考虑业务逻辑。你写了“动态SQL删除后跟提交”......如果你的意思是“紧随其后”,那么行独占锁已经立即释放。

0

我实际上“避免了这种情况”,意思是“这个答案不是解决问题的方法”。
我已经做了,以避免场景:

  1. 增加了一个列TAB1把唯一的标识号为每个进程。
  2. 使用此列仅删除与该特定进程相对应的行。 这,我相信已经避免了等待同一行的进程P1和P2。

感谢@Codo,@a_horse_with_no_name,@Ben,@Justin洞和@colemar在试图美化的问题情境,明智和您的支持你的一切帮助。

@Justin Cave:我一直在想你提出的同样的解决方案,但如果我昨天看到这个,我不会浪费时间到现在。无论如何,非常感谢您的支持。