2009-10-05 5 views
4

보고서 데이터를 가져 오거나 삽입하지 않고 데이터를 읽는 업데이트가없는 제품을보고하는 공급 업체가 있습니다.DB2의 선택 쿼리에 커밋이 필요합니까?

우리의 힙 크기는 3 배로 1024 x 4k 페이지입니다. 응용 프로그램이 일주일 동안 정상적으로 실행되면 DB2 SQL 오류가 표시됩니다. 트랜잭션 로그를 나타내는 SQLCODE : -954, SQLSTATE : 57011 요청을 수용 할 수 없습니다.

리사이클 후에도 정상적으로 작동하므로 보고서의 크기가 아닙니다. 나는 이것에 대해 다른 DBA와 이야기했다. 그는 문제가 ORACLE과 DB2의 차이점이라고 생각합니다. 공급 업체 코드가 엉성하고 선택 항목에 커밋을하지 않는다는 것입니다. 이로 인해 참조가 정리되지 않고 힙에 쓰레기로 천천히 누적됩니다.

커밋을 포함 할 필요가있는 삽입 및 업데이트 만 있다고 생각 했으므로 이것이 정확한지 알고 싶습니다. 이것에 대한 IBM 문서가 있습니까?

현재 문제를 완화하기 위해 매주 재활용하고 있습니다.하지만 코드를 변경하라는 공급 업체로 돌아 가기 전에 문제에 대해 잘 대처하고 싶습니다.

답변

8

모든 거래를 적절하게 해지해야합니다. 왜 삽입 및 업데이트에만 적용되는 것으로 생각 했습니까? 트랜잭션을 실행하려면 "select a from b from c> 12"를 선택한 다음 "from b from c < = 12"를 선택하십시오. 트랜잭션 내에서 DB는 모든 a가 첫 번째 또는 두 번째 선택에서 정확히 한 번만 반환되도록 보장해야합니다. 둘 다 (c가 null이 아니라고 가정하면 ;-). 트랜잭션 성이 없으면 일부 트랜잭션은 크랙 사이에 빠지거나 다른 트랜잭션에 의해 해당 트랜잭션이 변경된 경우 두 번 반환 될 수 있으며 ACID가 아님) -

따라서 이 아닌 경우은 별도의 SELECT 쿼리가 필요합니다. 트랜잭션 wrt 서로, DB를 말해! 그리고 당신이 말하는 방식은 각각의 선택 후에 트랜잭션을 종료하는 것입니다 (일반적으로 커밋은 목적을 위해 사용하는 것이지만 무관심하게 여기에서 롤백을 사용할 수 있습니다 .-)).

+0

감사합니다. alex, DBA가 아니기 때문에 생각은 삽입/업데이트 커밋 만 필요합니다. 상세한 예제를 제공해 주셔서 감사합니다. – Keibosh

+0

이것은 선택이 트랜잭션 내에서 실행된다는 것을 의미하지 않습니까? 그들이 그렇지 않다면 (물론 지정되지 않은 것에 많이 달려 있음), 이는 적용되지 않습니다. –

+0

@Harper, 예, 모든 DB2 쿼리 (일반 DB 이론에 따라)가 트랜잭션 방식으로 실행됩니다. 각 쿼리가 끝날 때마다 각 트랜잭션이 자동 커밋되는 모드를 설정할 수 있지만 명시 적 종료를 선택하면 이점이 있습니다. –

3

CONNECT, COMMIT 또는 ROLLBACK 이후의 첫 번째 SQL 활동은 트랜잭션을 시작합니다.

리소스 문제 (트랜잭션 로그가 가득)에 대한 핸들을 얻으려면 보고서를 발행하는 응용 프로그램을 조사해야합니다. 트랜잭션이 코드에서 명시 적으로 닫혀 있는지 확인해야합니다. 응용 프로그램 개발자가 가비지 수집기를 사용하여 데이터베이스 객체를 정리하는 경우를 보았습니다. 이러한 객체가 정리 대기 중일 때 데이터베이스 자원 (트랜잭션)은 열려 있습니다.

사용하는 프로그래밍 방법에 관계없이 데이터 처리가 완료되면 즉시 트랜잭션을 명시 적으로 COMMIT 또는 ROLLBACK하는 것이 좋습니다.

+1

이것은 우리가보고있는 증상에 대한 나의 설명에 의해서만 코드를 보지 않고 DBA가 가정 한 것입니다. 벤더와 이야기를 한 후에 그들은 왜 당신이 직선 선택에 대한 커밋을해야하는지 의문을 제기했다. 나는 여기에 와서 전문가에게 물어 보았다. 나는 그들의 애플리케이션이 원래 DB2가 아니라 오라클 용으로 작성되었다고 생각한다.Apparantly 오라클은 가난하게 코딩을 조금 더 우아하게 처리합니다. – Keibosh

관련 문제