我有一个更新查询,每次只重新计算一行中的每列值。 由于这些更新查询发生在同一行,我已经看到更多的行级锁争用。在Oracle中,更新不锁定行的方式?
我在想也许一个解决方案是让后续更新只是抢先任何正在进行的更新。这可能吗? Oracle是否支持这种更新?
拼出想法全:
- 更新查询#1开始,在自己的事务
- 需要更新行X
- 获取锁定行X
- 更新查询# 2开始,在其自己的交易
- 块中,等待查询#1释放行X上的锁。
我的想法是,第5步可以简单地为:查询#1中止,查询#2继续。或者可以免去首先获取行级锁。
如果更新查询只更新给定行中的列的子集,我意识到这种逻辑会是灾难性的错误。但事实并非如此 - 每次都重新计算每一列。
这似乎有点奇怪有在同一行上出现的这么多的更新。你确定某个其他进程是故意尝试更新该行吗?还是有某种锁升级正在进行?例如。手动表锁,选择更新而没有足够的选择性where子句,DDL,位图索引或未索引的外键。 – 2010-09-23 01:05:36
我同意这看起来很奇怪。这是因为用户数量巨大吗?或者是其他事情发生? (“选择更新”是一个好的罪魁祸首。)如果这是某种“全面运行”,我可能会寻求另一种解决方案。就像为每个子组运行总计而不是整体一样,然后查询将总结而不是仅检索表中的单个行。 – user158017 2010-09-23 02:12:58