更新零行然后提交?

时间:2010-09-10 23:29:16

标签: sql oracle commit

对于影响零行的更新,哪个过程更有效?

UPDATE table SET column = value WHERE id = number;

IF SQL%Rowcount > 0 THEN
 COMMIT;
END IF;

UPDATE table SET column = value WHERE id = number;

COMMIT;

换句话说,如果更新影响ZERO行并发出提交,我是否会产生任何额外费用?

我有一个系统受到日志文件同步等待的阻碍......我想知道是否发出提交;针对影响零行的事务,会将该语句写入日志,从而导致更多LGWR争用。

3 个答案:

答案 0 :(得分:5)

COMMIT会强制日志文件同步,因此系统必须等待。

然而,ROLLBACK也会这样做,并且在某些时候它们中的任何一个都必须发生。

因此,如果您既不发出COMMIT也不发出ROLLBACK,那么您只是暂停一个开放的交易,迟早导致日志同步等待。

您可能希望批处理UPDATE次操作,而不是等待第一次成功更新并提交。

答案 1 :(得分:3)

这有风险。从技术上讲,虽然UPDATE可能会影响零行,但它可以在表上的更新触发器之前或之后触发(而不是在行级别)。这些触发器可能“做某事”需要提交/回滚。

更安全地查看是否设置了LOCAL_TRANSACTION_ID

答案 2 :(得分:-1)

有许多理由可以成为等待log file sync的基础。主要罪魁祸首似乎不太可能提交更新了零行的SQL语句。确实,发出太多提交可能是导致此问题的原因。例如,如果应用程序设置为在每个语句之后提交(例如,通过使用AUTOCOMMIT = TRUE),而不是设计正确的事务。如果这是原因,那么除了对应用程序进行重大改写之外,您无能为力。

如果您想深入研究问题的根本原因,我建议您阅读Pythian的Riyaj Shamsudeen在Tuning ‘log file sync’ Event Waits上阅读这篇详尽(且令人筋疲力尽)的文章。