select for update 0 4 3,247

by ndkeka11 [Oracle 기초] 오라클 [2023.12.27 14:36:06]


어떤 트랜젝션에서 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을 띄우고 싶은데 나타나질 않네요.

by 마농 [2023.12.27 15:11:53]

1. 네. 해당 1건에 대해서 락을 겁니다.
2. 에러를 바로 만나고 싶다면
- 바로 업데이트 하지 말고, Select for update nowait 으로 먼저 락 획득 시도하셔야 할 듯 합니다.


by ndkeka11 [2023.12.27 15:22:34]

답변 감사합니다.

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;
(--여기에 커서만 깜빡이고 아무것도 나타나질 않습니다)


by 마농 [2023.12.27 15:58:53]

두번째 세션에서도 똑같이 Select for update nowait 하라는 의미로 답변 드렸습니다.


by ndkeka11 [2023.12.27 17:17:33]

감사합니다. 드디어 확인했네요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입