表上的锁定机制

时间:2012-12-12 17:23:59

标签: sql oracle plsql oracle11g locking

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

由SID = 123启动的进程P1包含许多除此TAB1相关操作之外的操作。

场景:

  • SID = 123有效; P1在TAB1上强制执行行独占锁定(从查询locked_object视图获得)。

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

  • SID = 124正在等待,直到SID = 123启动的过程P1完成为止; P2在TAB1上强制执行行独占锁(从查询locked_object视图获得)。

问题:

我认为P2的相同行级别锁定需要P1的行级别锁定“可以预先”。 我们能否手动覆盖TAB1上进程P1强加的锁定(我希望它是可能的),并在TAB1上的操作结束后释放锁定?这有助于减少P2现在对TAB1的长时间等待直到整个P1结束吗?

任何建议都将不胜感激。如果您需要更多相关信息,请与我们联系。

2 个答案:

答案 0 :(得分:0)

锁定在交易边界上发布,而不是在流程边界上发布。

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

当然,结束事务还将提交/回滚在上一次提交/回滚之后在同一会话中执行的其他操作。如果这是一个问题,您必须重新考虑业务逻辑。

等等,你写了“动态SQL删除后跟提交”......如果你的意思是“紧跟”,那么行独占锁已经立即释放。

答案 1 :(得分:0)

我实际上已经“避开了这个场景”,这意味着“这个答案不是解决问题的解决方案” 我为避免这种情况做了什么:

  1. 在TAB1中再添加一列,为每个流程添加唯一的标识号。
  2. 使用此列仅删除与该特定进程对应的行。 我相信这已经避免了进程P1和P2等待同一行。
  3. 感谢@ Codo,@ a_horse_with_no_name,@ Ben,@ Justin Cave和@colemar,感谢您在尝试美化环境并为您提供支持时给予的所有帮助。

    @Justin Cave:我一直在想你所提出的解决办法,但如果我昨天看到这个,我就不用浪费时间了。无论如何,非常感谢您的支持。