데이터충돌, DeadLock

데이터충돌 = 세션충돌 = Lock충돌

Lock

  • 동일한 시간에 동일한 데이터에 대해 서로 다른 세션이 동시에 적업하는 것을 막기위해 oracle은 DML발생시 관련행 단위로 LOCK을 구현.
  • LOCK은 트랜잭션 종료(commit, rollback)시 해제된다.
  • LOCK의 최소 단위는 행이다.
  • LOCK이 구현된 행에 작업 요청 시 Queue(큐)에서 기다린다.
  • ORACLE이 자동으로 락을 걸고 해지시켜준다.




Lock 충돌발생하는 경우

  • 커밋되지 앟은 트랜잭션
  • 긴 트랜잭션




일반적인 Lock충돌(블로킹) 해결방법

  • 블로킹 : 트랜잭션이 처리될 때 락이 걸림. 락이 해지 될때 까지 다른 트랜잭션이 해당 자원에 접근할 수 없음.
  • DBA에서 문의(LOCK충돌인지 DB가 뻗어버린건지 모르니 확인해달라고 요청해야함)
    • 블럭킹 하는 세션 132, 블럭킹 당하고 있는 세션 355
1
2
3
4
5
6
7
8
9
10
11
12
1  select username, sid, serial#, blocking_session
2 from v$session
3 where username is not null;

//출력값
USERNAME SID SERIAL# BLOCKING_SESSION
------------------------------ ---------- ---------- ----------------
SYS 3 22449
HR 132 2558
SYS 243 41831
HR 249 63962
HR 355 16534 132
  • DBA는 kill할 세션 확인 후 아래 쿼리 실행
    • 보통 블럭킹하고 있는 세션에게 commit해달라고 요청 후 kill해야한다.
1
2
SQL> alter system kill session '132, 2558' immediate;
System altered.




교착상태(DeadLock) Lock충돌 해결방법

  • 두 개 이상의 트랜잭션이 서로에게 락을 걸어 블로킹이 끊나지 않아 교착상태에 빠짐. (상대방이 원하는 자원을 내가 가지고 있고, 내가 원하는 자원을 상대방이 가진 경우. 서로 맞물린 상태.)
  • DB에서 자동 감지하고 자동으로 해결해준다. DBA가 해결 할 필요 없다.
    • DB의 해결방법 : 두 세션 중 비용적인 측면을 고려하여 하나의 세션을 선택한 다음 교착상태(DeadLock)이 발생되었다는 메세지와 함께 작업창을 열어준다. -> 열린 작업창은 작업을 양보해라는 의미이다. COMMIT할지 ROLLBACK할지 선택해야한다.
    • COMMIT : deadlock걸린 작업을 제외한 모든 작업들을 저장해준다.
    • ROLLBACK : 모든 작업을 롤백한다.