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

Sql DB2中的select查询是否需要提交?,sql,db2,Sql,Db2,我有一个供应商报告产品,执行查询以提取报告数据,没有插入,没有更新,只是读取数据 我们的堆大小翻了3倍,现在有1024个4k页面,应用程序将正常运行一周,然后我们将开始看到DB2SQL错误:SQLCODE:-954,SQLSTATE:57011,这表明事务日志无法容纳请求 这不是报告的大小,因为它们在循环后运行良好。我与另一位DBA就此进行了交谈。他认为问题在于ORACLE和DB2之间的差异,因为供应商代码很糟糕,并且没有在服务器上发出提交。这会导致引用无法清理,并在堆中作为垃圾慢慢累积 我想知

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

我们的堆大小翻了3倍,现在有1024个4k页面,应用程序将正常运行一周,然后我们将开始看到DB2SQL错误:SQLCODE:-954,SQLSTATE:57011,这表明事务日志无法容纳请求

这不是报告的大小,因为它们在循环后运行良好。我与另一位DBA就此进行了交谈。他认为问题在于ORACLE和DB2之间的差异,因为供应商代码很糟糕,并且没有在服务器上发出提交。这会导致引用无法清理,并在堆中作为垃圾慢慢累积

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


我们目前每周都在回收,以缓解问题,但我希望在回到供应商那里要求他们修改代码之前,能够很好地处理这个问题

任何事务都需要正确终止-为什么您认为这只适用于插入和更新?考虑从C中运行事务选择A,其中C>12,然后从B中选择一个B,其中C*P>亚历克斯的响应,在任何连接、提交或回滚之后的第一个SQL活动启动事务。 要获得资源问题事务日志的完整句柄,您应该调查发布报告的应用程序-确保事务在代码中显式关闭。我见过应用程序开发人员依赖垃圾收集器清理数据库对象的情况——当这些对象等待清理时,数据库资源事务保持打开状态


在处理完数据后立即显式提交或回滚事务始终是一种很好的做法,无论您使用何种编程方法。

在选择查询上提交事务时,我会遇到此错误,但尽管存在此错误,它仍会返回包含查询数据的结果集

交易承诺

错误[hy011][ibm]cli0126e操作无效sqlstate=hy011

我将代码更改为tran.Rollback;错误消除了


有人能解释一下这种行为吗?

谢谢alex,我自己不是DBA,因此只考虑插入/更新所需的内容。感谢您提供的详细示例,现在更容易看到。这难道不意味着选择是在事务中运行的吗?如果不是,当然,这在很大程度上取决于没有指定的内容,那么这就不适用。@Harper,是的,根据general DB理论,每个DB2查询都是以事务方式运行的。您可以设置一种模式,其中每个事务在每次查询后自动提交,但是选择显式终止具有优势。这是DBA的假设,没有看到任何代码,只是通过我对我们看到的症状的描述。在与供应商交谈后,他们询问您为什么需要对直接选择发出提交。这就是促使我来到这里并询问专家的原因:。我相信他们的应用程序最初是为Oracle而不是DB2编写的。显然,oracle对糟糕的编码处理得更优雅一些。