Date 충돌 = Session 충돌 = Lock 충돌
Lock
- 변경 작업 발생 시 DBMS는 관련 행 단위로 Lock을 구현하고 작업을 진행함.
- Lock 트랜잭션 진행 중에는 유지되고, 트랜잭션 종료 시 해제됨.
- Lock이 구현된 곳에 작업이 요청되는 경우 큐라고 하는 대기공간에서 기다림.
Lock 충돌
- Waiting이 길어지는 경우 Lock 충돌로 감지하고 해결해야함.
Lock 충돌의 원인
- 트랜잭션을 길제 진행하는 경우
- 커밋되지 않은 작업이 남아있는 경우
Lock 충돌 감지 방법(모니터링 방법)
-> DBA 권한 필요!(sys사용자)
- v$session : DB에 접속된 세션 정보와 Lock 충돌 정보를 모니터링 할 수 있는 DB 사전
Client 1
![](https://velog.velcdn.com/images/tlqdnwls/post/ebba68af-c5fe-45c2-bff5-217f2ec0d206/image.png)
Client 2
![](https://velog.velcdn.com/images/tlqdnwls/post/91cd76fd-dabc-444a-9629-21ba9f4d47d6/image.png)
Client 1
![](https://velog.velcdn.com/images/tlqdnwls/post/cacc6c9c-ddb0-47b3-8d68-7c76111e54f6/image.png)
client2가 작업중인 102번 사원 행에 update하려고 하니 lock이 걸려서 커서가 깜빡 거린다
sys
blocking_session
![](https://velog.velcdn.com/images/tlqdnwls/post/93d12d6c-ae53-4187-8896-baaa241de357/image.png)
130번 사용자가 막고 있음
select username, sid, serial
from v$session
where username is not null;
session kill 시키기
alter system kill session 'SID, Serial#' immediate;
![](https://velog.velcdn.com/images/tlqdnwls/post/861c5f14-f146-4fcb-9aa6-70a1c061e243/image.png)
![](https://velog.velcdn.com/images/tlqdnwls/post/d389ecc4-dbde-4154-852b-dc029168db2e/image.png)
130번 사용자 접속 끊음
Lock 충돌의 특이 케이스 : Deadlock(교착상태)
- 두 세션이 각자의 자원을 선점한 상태에서 상대방의 자원을 서로 요청하는 경우
- Deadlock은 특수한 경우 이므로 DBMS에 의해서 자동감지되고 해결됨.
- 한쪽 세션으로 Deadlock 오류 메ㅔ지가 자동으로 발생되면서 해결됨.
client1
![](https://velog.velcdn.com/images/tlqdnwls/post/0576e7e9-b103-454e-8706-4260574d55af/image.png)
client2
![](https://velog.velcdn.com/images/tlqdnwls/post/957cce57-532f-4afb-aa64-e71c4fecbe50/image.png)
client1
![](https://velog.velcdn.com/images/tlqdnwls/post/1c882d5a-056c-443b-a979-e41f4d1091c0/image.png)
커서 깜빡거리면서 lock 걸림
client2
![](https://velog.velcdn.com/images/tlqdnwls/post/9f979056-3e6f-4890-aea9-a5d743d2f69a/image.png)
lock 걸림
client1
![](https://velog.velcdn.com/images/tlqdnwls/post/ba251a4e-6b35-4da4-8eab-47772628664e/image.png)
에러메시지 뜨면서 lock 풀림. rollback 또는 커밋 하기