티스토리 뷰
반응형
데이터 베이스에 락이 필요한 이유
- 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
링크
TAG
- try catch finally
- 점층적 생성 패턴
- flatMap
- Spring
- 빈 순환 참조
- jdk버전
- 인프런
- java
- @Lazy
- 팩토리 메소드 패턴
- 김영한
- 이펙티브자바
- 연관관계
- ifPresent
- 빌더 패턴
- 이펙티브 자바
- 생성자
- 복사 팩토리
- try with resources
- junit
- java8
- JPA
- 정적팩터리메서드
- Effective Java
- mustache
- effectivejava
- 자바8
- springboot
- 스프링부트
- package-private
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함