首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表上的锁定机制

表上的锁定机制
EN

Stack Overflow用户
提问于 2012-12-12 17:23:58
回答 2查看 517关注 0票数 2

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

进程P1由SID=123发起,除了与TAB1相关的操作外,还包含许多操作。

设想情况:

  • SID=123是活动的;P1在TAB1(从查询locked_object视图中获得)上强加了一个排他锁。
  • 另一个甲骨文进程P2是由SID=124 (与P1完全相同的进程,但针对不同的数据输入)在某个时候(比如2-3分钟)启动的。
  • SID=124正在等待由SID=123启动的进程P1完成;P2对TAB1(从查询locked_object视图中获取)强加了一行独占锁。

问题:

我认为P2的行级锁期望P1的行级锁“可以继续”。我们能否手动重写process P1在TAB1上施加的锁定(我希望这是可能的),并在其对TAB1的操作结束后释放锁吗?这是否有助于减少P2现在在TAB1上等待的时间,直到整个P1结束?

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

EN

回答 2

Stack Overflow用户

发布于 2012-12-12 20:15:56

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

简而言之,如果希望P1立即释放锁,P1必须在delete操作之后以显式提交或回滚的方式结束当前的超越。

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

等等,你写了“动态SQL删除和提交”.如果您的意思是“立即跟踪”,则行排他锁已经立即释放。

票数 0
EN

Stack Overflow用户

发布于 2012-12-14 10:37:36

实际上,我已经“避免了这种情况”,这意味着“这个答案不是问题的解决方案”。

我为避免这种情况所做的事情:

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

感谢“Codo,@a_horse_with_no_name”,“Ben”,“Justin Cave”和“colemar”,感谢您在美化问题上下文方面的所有帮助--明智和您的支持。

@贾斯汀·凯夫:我一直在想你提出的同样的解决方案,但如果我昨天看到这个,我就不用浪费时间了。不管怎样,非常感谢你的支持。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13845228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档