我有供应商报告产品执行查询以提取报告数据,没有插入,没有更新只是读取数据。
我们的堆大小增加了3倍,现在是1024个4k页,应用程序将运行一周,然后我们将开始看到DB2 SQL错误:SQLCODE:-954,SQLSTATE:57011表示事务日志是无法满足要求。
它不是报告的大小,因为它们在回收后运行良好。我就此与另一位DBA进行了交谈。他认为问题在于ORACLE和DB2之间的区别在于供应商代码很糟糕而且没有对选择发出提交。这导致引用不被清理,并且在堆中慢慢累积为垃圾。
我想知道这是否准确,因为我认为只需要包含提交所需的插入和更新。是否有关于此的IBM文档?
我们目前正在每周回收以解决问题,但我想在回到供应商要求他们改变他们的代码之前对这个问题有一个很好的处理。
答案 0 :(得分:9)
任何交易都需要正确终止 - 为什么你认为这只适用于插入和更新?考虑以交易方式运行“从b中选择a,其中c> 12”,然后“从b中选择a,其中c <= 12”;在一个事务中,DB必须保证每个a从第一个或第二个select中返回一次,而不是两者(假设c永远不为null ;-)。如果没有交易性,如果相应的c被不同的交易改变了,那么一些可能会落在裂缝之间,或者返回两次,而这只是不是ACID! - )
所以当你不需要单独的SELECT查询相互交易时,请告诉数据库!而你所说的方式是在每次选择之后终止事务(通常提交是你用于此目的的,尽管我猜你可以,无差别地选择在这里使用回滚; - )。
答案 1 :(得分:3)
根据Alex的回复,任何CONNECT,COMMIT或ROLLBACK之后的第一个SQL活动都会启动一个事务。
要处理资源问题(事务日志已满),您应该调查发布报告的应用程序 - 确保在代码中显式关闭事务。我见过应用程序开发人员依赖垃圾收集器清理数据库对象的情况 - 当这些对象等待清理时,数据库资源(事务)保持打开状态。
无论您使用何种编程方法,都可以在完成数据后立即显式COMMIT或ROLLBACK您的事务。
答案 2 :(得分:0)
我在SELECT查询上提交事务时遇到此错误,但是尽管有此错误,它仍会返回包含查询数据的Result-Set
。
tran.Commit();
error [hy011] [ibm] cli0126e the operation is invalid sqlstate=hy011
我将代码更改为tran.Rollback();
,错误消失了。
任何人都可以解释这种行为吗?