首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Oracle中,一种不锁定行的更新方式?

在Oracle中,一种不锁定行的更新方式?
EN

Stack Overflow用户
提问于 2010-09-23 00:39:39
回答 3查看 5.3K关注 0票数 5

我有一个更新查询,每次精确地在一行中重新计算-每个列的值。由于这些更新查询发生在同一行,我已经看到了更多的行级锁争用。

我在想,也许有一种解决方案是让后续的更新抢占已经在进行的任何更新。这个是可能的吗?Oracle支持这种更新吗?

详细地阐明这个想法:

  1. 更新查询#1在它自己的事务中开始
  2. 需要更新行X
  3. 获得X行的锁
  4. 更新查询#2开始,同样是在它自己的事务中。
  5. 块,等待查询1释放X行上的锁。

我的想法是,可以步骤5简单地是:查询#1被中止,查询#2继续进行。或者从一开始就放弃获取行级锁。

我意识到,如果更新查询只更新给定行中的一个列的子集,那么这个逻辑将是灾难性的错误。但不是--每一列都要重新计算,每次。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-23 03:05:11

我想问一下,无论你在做什么,物理表是否是正确的机制。一个因素是需要如何处理事务。任何意味着“在事务持续期间不要锁定”的内容都会遇到事务性问题。

有几个非事务性选项:

全球背景值可能很有用(取决于您是否在RAC上)以及重新启动后如何处理持久性。

另一种选择是管道,您可以让后台进程维护该表,而单独的会话向该进程发送消息,而不是直接更新表。

排队是另一个想法。

如果您只需要减少记录被锁定的时间,自主交易可能是答案。

票数 5
EN

Stack Overflow用户

发布于 2010-09-23 17:36:54

如果查询1正在使用SELECT FOR UPDATE和诺瓦特进行,则可以执行与您要求相反的操作。

或者,您可以尝试通过调整隔离水平来查看是否能够获得所期望的效果,但我建议您在没有进行广泛测试的情况下这样做,因为您不知道它可能会产生什么连锁效应。

票数 1
EN

Stack Overflow用户

发布于 2014-01-22 17:51:23

甲骨文的UPDATE不支持任何锁定提示。

OraFAQ论坛提出了这样一个棘手的解决方案:

代码语言:javascript
复制
DECLARE
  x CHAR(1);
BEGIN
  SELECT 'x' INTO x
  FROM tablea
  WHERE -- your update condition
  FOR UPDATE OF cola NOWAIT;

  UPDATE tablea
  SET cola = value
  WHERE -- your update condition
EXCEPTION
  WHEN OTHERS THEN
  NULL; -- handle the exception
END;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3774646

复制
相关文章

相似问题

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