2009-08-14 3 views
1

여러 컴퓨터에 배포 된 응용 프로그램 - 동일한 DB 테이블에 액세스합니다. MIN 행을 읽고 해당 행을 삭제합니다.Hibernate/DB2 -913 교착 상태

동시에 발생하면 교착 상태를 나타내는 DB2에서 -913 오류가 발생합니다.

다음 옵션을 이미 시도했습니다. 1. 행을 잠급니다. 2. 교착 상태가 발생한 후 응용 프로그램 코드에서 메커니즘을 다시 시도하십시오.

아무 것도 작동하지 않습니다.

아이디어/참조 자료/솔루션?

TY

답변

1

확인 문제가 교착 상태 (이유 코드 2)하거나 잠금 타임 아웃이 실제로 경우 SQL0913N과 관련된 이유 코드를 결정하는 (> 2).

문제점이 실제로 교착 상태 인 경우, 교착 상태에 대한 DB2 이벤트 모니터를 활성화하여 교착 상태에 대한 자세한 추적 정보를 8 처할 수 있습니다. Hibernate에 의해 사용자를 대신하여 생성 된 특정 명령.을 아직 캡처하지 않은 경우 SQL 문 이벤트 모니터를 정의하고 활성화하여 가능한 한 자세하게 캡처 할 수 있습니다.

Hibernate가 사용하는 격리 수준은 동시성에 큰 영향을 줄 수 있습니다. 일반적으로 응용 프로그램은 언 커미트 읽기 (Uncommitted Read) 격리를 통해 더티 읽기를 수행 할 수있는 경우 잠금이 적게 발생하지만 커밋되지 않은 데이터를 노출하고 DB2의 ACID 속성을 손상시킬 수 있으므로 이상적이지 않습니다. 커밋되지 않은 변경 사항이있는 행은 잠겨있는 대신 다른 연결에서 볼 수 있기 때문에 더티 읽기를 이미 활성화 한 경우 특정 문제에 영향을 미칠 수 있습니다.

응용 프로그램 디자인 (효과적으로 단일 작업 대기열에 대한 다중 스레드 액세스)은 이상적이지 않을 수 있으며 리팩터링의 이점을 누릴 수 있습니다. 식당 철학자 문제는 경합을 줄이기 위해 다양한 솔루션 패턴을 제공합니다. 응용 프로그램의 특성에 따라 상태 플래그를 일찍 설정하는 것과 같이 행 처리 방법을 변경할 수 있습니다. 이는 다른 스레드가 특정 행이 이미 다른 스레드에서 처리 중이며 건너 뛸 수 있음을 이해하는 데 도움이됩니다. . 트랜잭션 빈도를 약간 조정하여 커밋 빈도를 높이면 문제가 완화 될 수도 있습니다.

DB2 9.7 (2009 년 6 월 릴리스)의 현저한 개선 사항 중 하나는 잠긴 행의 현재 커미트 된 버전에 대한 액세스를 제공하는 커서 안정성 분리 기능 향상입니다.