어떤 트랜젝션에서 select * from emp where empno = 7866 for update nowait; 이렇게 했다면
1. 다른 트랜젝션이 update emp set sal = sal + 1 where empno = 7888; 이런식으로 했을때 update가 되던데
select for update에서 걸린 하나의 row만 Lock을 거는건가요? 아니면 이 row가 속한 블록에 Lock을 거는건가요?
2. 그리고 다른 트랜젝션이 update emp set sal = sal + 1 where empno = 7866; 했을때 ORA-00054 Exception을 던진다고 하던데 그냥 아무것도 안뜨다가
select for update를 사용했던 트랜젝션에서 commit을 해야 그제서야 1개의 행이 업데이트 됬다고 나오더라구요. Exception을 띄우고 싶은데 나타나질 않네요.
1. 네. 해당 1건에 대해서 락을 겁니다.
2. 에러를 바로 만나고 싶다면
- 바로 업데이트 하지 말고, Select for update nowait 으로 먼저 락 획득 시도하셔야 할 듯 합니다.
답변 감사합니다.
sqlplus 2개를 열고 첫번째 sqlplus에서 select * from emp where empno = 7866 for update nowait;
이렇게 작성을 했고
두번째 sqlplus에서는 update emp set sal = sal + 1 where empno = 7866; 이렇게 작성했는데
SQL> update emp set sal = sal + 1 where empno = 7866;
(--여기에 커서만 깜빡이고 아무것도 나타나질 않습니다)
감사합니다. 드디어 확인했네요.
두번째 세션에서도 똑같이 Select for update nowait 하라는 의미로 답변 드렸습니다.