Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 启用“自动提交”时,显式提交是否正常?_Sql_Oracle - Fatal编程技术网

Sql 启用“自动提交”时,显式提交是否正常?

Sql 启用“自动提交”时,显式提交是否正常?,sql,oracle,Sql,Oracle,我已经搜索了一段时间,但找不到这个。我与Oracle合作,有一个类似于以下内容的For循环: BEGIN FOR YEARIDs IN (SELECT DISTINCT YEARID From MyTable) LOOP UPDATE ( SELECT ...... ) SET MyFlag = 1; COMMIT; -- Added END LOOP; END; 自动提交已启用,但在整个F

我已经搜索了一段时间,但找不到这个。我与Oracle合作,有一个类似于以下内容的For循环:

BEGIN
  FOR YEARIDs IN (SELECT DISTINCT YEARID From MyTable)
  LOOP
    UPDATE (
              SELECT    ......
            )
    SET     MyFlag = 1;
    COMMIT;  -- Added
  END LOOP;
END;
自动提交已启用,但在整个FOR循环完成之前,提交似乎不会发生。因此,我在上面的代码中添加了Commit语句。这是否会导致任何意外的结果,或者这是否违反了任何最佳实践?(即,当启用自动提交时,我是否应该进行显式调用以提交?)

谢谢, 斯科特

编辑:哎呀。。。我使用Oracle 11g和Oracle SQL Developer作为客户端


编辑:感谢您的回复,到目前为止。在查询运行的时间点,数据正在生成和调整。其他连接不应试图访问数据。至于为什么我经常提交,在开发过程中,我对数据的子集运行查询,查询运行得很好。该表包含大约1400万条记录,我正在测试大约10万条记录。查询相当复杂,对该子集运行大约需要5分钟。当我对整个表运行它时,查询运行了14个多小时,没有更新任何记录。我的理论是,持有大量撤销信息可能会消耗开发服务器上的所有可用资源。如果我频繁提交,撤销信息可以被释放和重用。是的,很慢。但是,如果查询将实际完成,即使它需要一整晚,那么它可以移动到测试服务器。(性能调整可以在以后进行。)这方面的最后期限早已过去。(我是在错过最后期限后才被邀请帮忙的。我的专业领域不是Oracle。)

在循环内提交通常是个坏主意(允许任何工具自动提交也是如此)

在循环中提交会使编写可重启代码变得更加困难。如果在3次迭代后遇到错误,会发生什么?您现在已成功提交了2条
UPDATE
语句的结果。据推测,您需要找出哪些行被更新并编写代码来反转更新,或者必须添加代码,以避免尝试更新这两个成功的
yearid
值的数据。这当然是可能的。但它涉及到编写一系列代码来跟踪您的进度,通常会使您的代码更加复杂

在循环中提交会使代码慢得多。提交通常是一个相当昂贵的操作。因此,在循环中执行通常是一个坏主意。如果您只有几十次循环迭代,那么问题就不那么严重了。但是如果你有成百上千的迭代,你可以很容易地把大部分时间花在提交上

在循环内提交会大大增加导致ORA-01555错误的风险。对
MyTable
的查询需要数据的读取一致性视图。但是,如果您在循环内提交,您就告诉Oracle您的会话不再需要较旧的
UNDO
数据。如果Oracle碰巧清除了循环后续迭代所需的
UNDO
数据,您将得到一个错误。然后,您将重新处理不可重启的代码,您成功地完成了N次迭代,但您不知道哪些年份已经处理或哪些需要处理

在循环内提交可能会产生数据一致性问题。例如,如果其他一些会话正在运行报告,这些报告很容易看到部分更新的数据,这通常意味着数据不一致。如果3年的数据发生了变化,但其他年份没有发生变化,则很难理解报告,人员(或流程)很容易做出错误的决策


在循环内提交也会降低代码的可重用性。如果您的代码包含提交(或回滚到您在块内建立的保存点之外的其他保存点),则任何其他不希望提交其事务的代码段都无法调用它。这导致人们试图在没有事务控制的情况下重新实现您的逻辑,或者错误地破坏事务完整性,这不可避免地导致他们构建引入数据一致性问题的应用程序。

在循环内提交通常是一个坏主意(允许任何工具自动提交也是如此)

在循环中提交会使编写可重启代码变得更加困难。如果在3次迭代后遇到错误,会发生什么?您现在已成功提交了2条
UPDATE
语句的结果。据推测,您需要找出哪些行被更新并编写代码来反转更新,或者必须添加代码,以避免尝试更新这两个成功的
yearid
值的数据。这当然是可能的。但它涉及到编写一系列代码来跟踪您的进度,通常会使您的代码更加复杂

在循环中提交会使代码慢得多。提交通常是一个相当昂贵的操作。因此,在循环中进行通常是一个坏主意。如果您只有几十次循环迭代,那么问题就不那么严重了。但是如果你有成百上千的迭代,你可以很容易地把大部分时间花在提交上

在循环内提交会大大增加导致ORA-01555错误的风险。对
MyTable
的查询需要数据的读取一致性视图。但是,如果您在循环内提交,您就告诉Oracle您的会话不再需要较旧的
UNDO
数据。如果Oracle碰巧清除了循环后续迭代所需的
UNDO
数据,您将得到一个错误。然后你又回到了处理不可重启的代码,在那里你成功了