데이터충돌, DeadLock
데이터충돌 = 세션충돌 = Lock충돌
Lock
- 동일한 시간에 동일한 데이터에 대해 서로 다른 세션이 동시에 적업하는 것을 막기위해 oracle은 DML발생시 관련행 단위로 LOCK을 구현.
- LOCK은 트랜잭션 종료(commit, rollback)시 해제된다.
- LOCK의 최소 단위는 행이다.
- LOCK이 구현된 행에 작업 요청 시 Queue(큐)에서 기다린다.
- ORACLE이 자동으로 락을 걸고 해지시켜준다.
Lock 충돌발생하는 경우
- 커밋되지 앟은 트랜잭션
- 긴 트랜잭션
일반적인 Lock충돌(블로킹) 해결방법
- 블로킹 : 트랜잭션이 처리될 때 락이 걸림. 락이 해지 될때 까지 다른 트랜잭션이 해당 자원에 접근할 수 없음.
- DBA에서 문의(LOCK충돌인지 DB가 뻗어버린건지 모르니 확인해달라고 요청해야함)
- 블럭킹 하는 세션
132
, 블럭킹 당하고 있는 세션355
- 블럭킹 하는 세션
1 | 1 select username, sid, serial#, blocking_session |
- DBA는 kill할 세션 확인 후 아래 쿼리 실행
- 보통 블럭킹하고 있는 세션에게 commit해달라고 요청 후 kill해야한다.
1 | SQL> alter system kill session '132, 2558' immediate; |
교착상태(DeadLock) Lock충돌 해결방법
- 두 개 이상의 트랜잭션이 서로에게 락을 걸어 블로킹이 끊나지 않아 교착상태에 빠짐. (상대방이 원하는 자원을 내가 가지고 있고, 내가 원하는 자원을 상대방이 가진 경우. 서로 맞물린 상태.)
- DB에서 자동 감지하고 자동으로 해결해준다. DBA가 해결 할 필요 없다.
- DB의 해결방법 : 두 세션 중 비용적인 측면을 고려하여 하나의 세션을 선택한 다음 교착상태(DeadLock)이 발생되었다는 메세지와 함께 작업창을 열어준다. -> 열린 작업창은 작업을 양보해라는 의미이다. COMMIT할지 ROLLBACK할지 선택해야한다.
- COMMIT : deadlock걸린 작업을 제외한 모든 작업들을 저장해준다.
- ROLLBACK : 모든 작업을 롤백한다.