2

我们有一个由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 的行级锁“可以继续”。我们是否能够手动覆盖进程 P1 对 TAB1 施加的锁定(我希望这是可能的),并在其对 TAB1 的操作结束后释放锁定?这是否有助于减少 P2 现在在 TAB1 上等待整个 P1 结束的漫长等待?

任何建议将不胜感激。如果您需要更多信息,请告诉我。

4

2 回答 2

0

锁是在事务边界上释放的,而不是在进程边界上释放的。

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

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

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

于 2012-12-12T20:15:56.900 回答
0

我实际上已经“避免了这种情况”,这意味着“这个答案不是解决方案”。
我为避免这种情况所做的一切:

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

感谢@Codo、@a_horse_with_no_name、@Ben、@Justin Cave 和@colemar 在尝试根据上下文美化问题和支持方面提供的所有帮助。

@Justin Cave:我一直在考虑与您提出的相同解决方案,但如果我昨天看到这个,我就不必浪费时间了。无论如何,非常感谢您的支持。

于 2012-12-14T10:37:36.517 回答