代码之家  ›  专栏  ›  技术社区  ›  Keibosh

DB2中的select查询是否需要提交?

  •  4
  • Keibosh  · 技术社区  · 16 年前

    我有一个供应商报告产品,执行查询以提取报告数据,没有插入,没有仅读取数据的更新。

    我们的堆大小翻了三倍,现在是10244K页,应用程序将运行一周,然后我们将开始看到DB2SQL错误:sqlcode:-954,sqlstate:57011,这表明事务日志无法满足请求。

    它不是报表的大小,因为它们在回收后运行良好。我和另一位DBA谈过这个问题。他认为,问题在于Oracle和DB2之间的区别在于,供应商代码很糟糕,没有在选择中发布提交。这导致引用未被清除,并且正缓慢地作为垃圾堆积在堆中。

    我想知道这是否是准确的,因为我认为只有插入和更新需要包括提交。有关于这个的IBM文档吗?

    我们目前每周都在回收利用,以缓解问题,但在回到供应商要求他们修改代码之前,我想对这个问题有一个很好的处理。

    2 回复  |  直到 16 年前
        1
  •  8
  •   Alex Martelli    16 年前

    任何事务都需要正确终止——为什么您认为这只适用于插入和更新?考虑以事务方式运行a“从b中选择a,其中c>12”,然后“从b中选择a,其中c<=12”;在事务中,db必须确保每个a从第一个或第二个选择中返回一次,而不是同时返回两个选择(假设c从不为空;-)。如果没有交易性,一些A可能会落在裂缝之间,或者如果它们对应的C被另一个交易更改,则返回两次,这不是酸性的!-)

    所以当你这样做的时候 不 需要单独的select查询进行事务处理,请告诉db!您可以这样说,就是在每次选择之后终止事务(通常提交是为了实现这个目的而使用的,不过我想您可以在这里选择使用rollback;-)。

        2
  •  3
  •   Michael Hvizdos    16 年前

    根据Alex的响应,任何连接、提交或回滚之后的第一个SQL活动都会启动一个事务。

    要处理您的资源问题(事务日志已满),您应该调查发出报告的应用程序-确保事务在代码中被显式关闭。我见过应用程序开发人员依赖垃圾收集器清理数据库对象的情况——当这些对象等待清理时,数据库资源(事务)保持打开状态。

    在处理完数据后立即显式地提交或回滚事务始终是一个好的实践——不管您使用的是什么编程方法。