티스토리 뷰

DataBase

오라클의 대기와 락

메성 2019. 12. 9. 10:28
반응형

데이터 베이스에 락이 필요한 이유

- UPDATE를 진행할 때 다중의 오라클 클라이언트가 동시에 같은 컬럼의 데이터를 변경 시 데이터가 의도하는대로 변경하기 어려움
- 이런 문제가 발생한 원인을 찾아보면 데이터를 확보하지 않았기 때문이라는 것을 알 수 있음.
- 락의 본질은 이렇게 다중 처리를 실현하기 위해 처리를 보호하는 것
- 행 락이 풀리는 시점은 커밋 또는 롤백할 때 풀림
- UPDATE문 등의 DML에는 자동으로 락을 걸어버림

대기와 락 대기

- 대기는 실제로 기다린다라는 것을 표시하는 것 뿐임
- 대기에는 '처리할 것이 없어서 쉬고 있는 대기', '이유가 있어 어쩔수 없이 하는 대기, 이상 상태 등 쓸데없이 SQL을 기다리게 하는 대기'가 있음
- 전자가 아이들 대기, 후자가 아이들이 아닌 대기

[아이들이 아닌 대기에 주의]
- 이유가 있어서 어쩔 수 없이 하는 대기는 정상적인 예로 디스크 I/O 대기가 있음
- 오라클은 SQL 처리 도중에 데이터가 필요해졌을 때는 디스크에서 블록을 읽어오며, 그때 대기가 발생
    - SQL 처리에 필요한 대기라고 함
- 이상 사태 등 쓸데없이 SQL을 기다리게 하는 대기는 판단하기가 어렵
    - 예를 들어 한 사용자가 어떤 테이블에 락을 걸어 버린 후에 식사하러 갔다 등이 있을 수 있음.

[락에 의한 대기란?]
- 락은 사용자에 의해 발생하는 구조
- 락이 걸려 있는 대상에 다시 락을 걸려고 했을 때 대기가 발생
    - 락 걸려고 했는데 걸려 있어서 일단 대기
- 자주 볼 수 있는 락
    - TX : 행과 관련된 락
    - TM : 테이블에 거는 락

[데드락의 구조]
- 이름에서도 알 수 있듯이, 고장 나서 작동하지 않는 열쇠라고 생각하면 됨
- 서로가 상대방이 보유하고 있는 락을 기다리느라 영원히 처리를 진행할 수 없는 상태를 말함.
- 데드락(ORA-0060 발생)일 때는 오라클에 의해 자동으로 한쪽의 처리가 롤백되며, ALERT 파이로가 트레이스 파일에 정보가 표시됨

래치의 구조

- 래치는 우선순위를 말함
- 래치도 다중 처리를 구현하기 위한 락
- 래치는 오라클 내부에서 자동으로 얻으며, SQL을 한번 실행하기 위해서는 여러 래치를 얻고 해제하기를 반복해야 함
- 래치는 메모리나 데이터를 조작할 대 상호 배타적으로 처리하지 않으면 데이터가 손상될 수 있는 경우를 보호하고자 사용

[래치의 경합]
- 프로세스 A가 래치를 갖고 있으나 CPU 권한이 없어서 대기 중..
- 프로세스 B는 CPU권한이 있는데 래치가 없어서 대기
- 무기한 대기..

정리

- 대기는 단순히 기다리고 있다는 상황을 표시하고 있는 것에 지나지 않음
- 아이들 대기 이벤트와 아이들이 아닌 대기 이벤트가 있음
- 락은 처리를 보호하기 위해 존재
- 데드락은 상대방이 소유하고 있는 락을 요청해서 처리를 진행하지 못하는 상태다
- 락 경합을 해소하기 위해서는 애플리케이션 측에서 대처해야 하는 때가 많다
- 래치는 오라클 내부의 중요한 것을 보호하기 위해 존재함
- 시스템이 대규모가 아닐 대 래치 경합이 심하다면 CPU 자원이 부족하거 페이징 등 바람직하지 않은 상태인지를 확인함
- 오라클을 제대로 운영하기 위해서는 토대가 되는 OS도 제대로 된 상태가 아니면 안됨
반응형

'DataBase' 카테고리의 다른 글

[MySQL] MySQL 스토리지 엔진  (0) 2020.02.17
리두와 언두의 동작  (0) 2019.12.09
오라클의 데이터 구조  (0) 2019.12.09
커넥션과 서버 프로세스의 생성  (0) 2019.12.06
오라클의 기동과 정지  (0) 2019.12.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함