/* 문법1 */
SELECT Query ~ FOR READ ONLY WITH UR;
SELECT Query ~ FOR FETCH ONLY WITH UR;
용도 설명
0. DB2는 기본적으로 아무 옵션없이 조회를 하면 먼저 테이블락을 걸고 조회후 테이블락을 푼다. 하지만 위의옵션을 붙히면 테이블락을 걸지 않고 조회한다.
1. Cursor를 Read-Only 상태로 연다.
2. 조회 테이블이 읽기전용이어서 커서가 UPDATE 및 DELETE문에서 참조될수 없음을 나타냅니다.
주의 사항
1. Pro*C 환경의 조회용 정적쿼리에 맨끝에 "FOR READ ONLY WITH UR"을 붙여 실행하면 에러가 발생한다.
발생하는 에러내용도 상관도 없는 부분에서 발생했다고 출력되어 삽질하기 딱좋다.
이때는 "WITH UR"로 변경한후 실행하면 정상실행 된다. 왜그런지는 모르겠다.
/* 문법2 */
SELECT Query ~ WITH UR;
용도 설명
0. 다른 transaction을 무시하고 작업수행을 해라.
1. 작업 단위(UOW)동안 읽은 행을 다른 응용프로그램 프로세스가 변경할 수 있습니다.
다른 응용프로그램 프로세스가 변경한 행을 비록 그 응용프로그램 프로세스가 변경사항을 확인하지 않더라도읽을 수 있습니다.
2. 트랜잭션 진행중인 원장을 조회할수 있음
3. select 구문은 with ur을 붙이는 것이 제일 빠르다. with ur을 사용함으로써 shared lock이 풀리는 듯한 효과가있다.
DB2에서는 lock이 escalate(단계적으로 확대되다)되므로 dead lock이 될수 있습니다.
※ 일반적으로 교착상태가 자중 걸리는 원장은 FOR READ ONLY WITH UR; 옵션을 붙여 조회하길 권장한다.
※ 삽입, 수정, 삭제 SQL문의 끝에 사용되는 WITH UR의 의미
삽입, 수정, 삭제 쿼리문에도 WITH UR 을 붙여 실행할수 있지만 큰 의미가 없습니다.
왜냐하면 DB2에서는 WITH UR 에 관계없이 삽입, 갱신, 삭제되는 원장의 모든 행에 독점잠금 (Lock)을 합니다.
따라서, 응용프로그램에서 변경된 행을 COMMIT, ROLLBACK 하기 전까진 다른 응용프로그램에 의해서는 절대로 변경할수(삽입, 수정, 삭제) 없고 대기하다가 커밋이나, 롤 백처리가 되면 그때 비로소 해당 원장을 변경합니다.
물론 다른 응용프로그램 프로세스에서 WITH UR을 사용하면 현재 응용프로그램에서 COMMIT, ROLLBACK 하기 전이라도 현재 수정되고 있는 상태로 조회할(읽을수는) 수는 있습니다.
※ IBM에서는 조회시에 가능한 WITH UR 이나 FOR READ ONLY WITH UR를 쓰는것을 권장합니다.
※ SELECT 이외의 절에 WITH UR을 사용하면 TRANSACTION이 엉킬수 있다.
※ DB2에서는 자주 액세스하는 테이블을 WITH UR을 주지 않고 조회하면 가끔씩 락이(?) 걸려 다른 사람들이조회를 할수 없을때도 있다.
|