웹 프로그램 실행 후, 트랜잭션 commit 이 되지 않았는지.. 특정 테이블에 대해서만 SELECT 및 기타 작업이 되지 않는데요..
db 콘솔 상에서 commit 이나 rollback 하는 방법이 없나요??
실행을 해봤지만.. 여전히 작업이 안되네요..
이런경우 어떻해야하나요?? 데이터베이스를 재시작 해야하나요??
특정프로그램의 트랜잭션이 끝나지 않고 오브젝트에 lock을 보유하고 있는경우에는 다른 프로그램에서 그 오브젝트를 lock으로 인해 access할수 없습니다.
그럴 경우에는 lock을 보유하고 있는 session을 찾아 강제로 force하셔야 합니다.
특정 테이블에 lock이 걸려 있는 경우 그 테이블을 access한 프로그램을 찾아야 한다.
db2에서는 snapshot 모니터링을 이용해 lock을 보유한 agent를 찾을 수 있다.
get snapshot 명령어를 사용해도 되고 snapshot 모니터 함수를 사용하셔도 됩니다.
snapshot 모니터 함수를 사용하는 방법
1) db2 get monitor switches
를 사용하여 switche가 ON되어 있는 지 확인한다.
2) lock이 걸려 있는 테이블 에 대해 selec문을 실행한다.
3) 다른 창에서 다음 snapshot 함수를 실행한다.
db2 "select agent_id,AGENT_ID_HOLDING_LK,table_name from table(snapshot_lockwait('DB명',-1)) as a "
agent_id 는 잠금 대기중인 agentid
agent_id_holding_lk는 잠금을 보유한 agentid
table_name는 locking중인 테이블
4) agent_id_holding_lk에 나오는 값은 lock을 보유한 agentid이다.
이값을 사용하여 해당 agentid을 force하면 된다.
db2 "force application (agentid)"
이렇게 하면 해당 session을 kill할수 있다.