[DB] 면접 준비

박세건·2024년 4월 30일
1

직무면접대비

목록 보기
2/5
post-thumbnail

테이블 파티셔닝이 필요한 이유와 범위에 대해 설명해주세요.

테이블 파티셔닝

  • 서비스의 크기가 점점 커지고 데이터가 일정 규모를 넘어서면 인덱스 조정이나 쿼리 변경으로 한계가 있고, 적절한 인덱스가 있어도 탐색의 효율성이 떨어져 시간이 오래 걸린다.
  • 이러한 문제를 해결하기위해, 파티션을 적용시켜 파티션이라는 단위로 나누어서 관리한다면 쿼리를 변경하지 않고 성능을 향상시킬 수 있다.
    ex) 생성날짜의 월단위를 기준으로 데이터 분할

파티션 장단점

  • 장점 :
    • 가용성 : 파티셔닝을 통해서 전체 데이터 훼손 가능성이 줄어든다.
    • 관리용이성 : 큰 테이블들을 제거해서 관리를 쉽게 해준다.
    • 성능 : 특정 DML과 Query의 성능을 향상, 주로 대용량 환경에서 효율적
  • 단점 :
    • 테이블간의 Join 비용이 증가
    • 테이블과 인덱스를 별도로 파티션이 불가능하다.

파티셔닝의 범위

Range Partitioning (범위 분할)
- 분할 키 값이 범위 내에 있는지 여부로 구분한다 .
- 가장 단순하고, 시간이 단축되지만, 특정 파티션에 데이터가 몰릴 수 있다.
Hash Partitioning (해시 분할)
- 해시 함수의 값에 따라 파티션에 포함할 지 여부를 결정한다.
- 성능 향상이 주 목적이다.
- 특정 데이터가 어느 파티션에 있는지 판단이 불가능하다.
List Partitioning (리스트 분할)
- 특정 컬럼의 특정 값을 기준으로 파티셔닝을 하는 방식이다.
- ex) 아시아 - [한국, 중국, 일본]
Composite Partitioning (합성 분할)
- 여러 기법을 결합해 사용한다.

사용방법

CREATE TABLE sales (
    id INT,
    sale_date DATE,
    amount DECIMAL(10, 2)
)
PARTITION BY RANGE (YEAR(sale_date)) (
    PARTITION p2020 VALUES LESS THAN (2021),
    PARTITION p2021 VALUES LESS THAN (2022),
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION p_future VALUES LESS THAN MAXVALUE
);

해당 쿼리를 사용하고 기본적인 쿼리를 사용하게되면 알맞은 파티션을 알아서 검색하는 개념

리플리케이션 vs 클러스터링(군집화)

리플리케이션(Replication)
여러개의 DB를 권한에 따라 수직적인 구조(Matser-Slave)로 구축하는 방식

  • 리플리케이션은 주 서버에 있는 데이터를 다른 서버에 복제하여 동일한 데이터 사본을 여러 서버에 유지
  • 비동기 방식의 복제 시스템으로 응답이 빠름
    • 변경사항을 즉시 복제하는 것이 아닌 모아놓고 처리
  • 데이터 동기화가 보장되지 않아 데이터 일관성이 없을 수 있음

클러스터링(Clustering)
여러개의 DB를 수평적인 구조로 구축하는 방식

  • 데이터가 모든 노드에 저장될 수도 있지만, 데이터를 분산하여 저장하는 방식도 사용될 수 있습니다. 클러스터링은 무조건 데이터 복제를 의미하지 않습니다.
  • 동기 방식으로 데이터 동기화하여 쓰기 성능은 리플리케이션에 비해 떨어짐
    • 변경사항을 신호(OK) 요청으로 동기적으로 처리
  • 1개의 노드가 죽어도 계속 운영 가능
  • 항상 일관성있는 데이터
  • 샤드랑 비슷

DB와 스키마의 차이

  • DB : 데이터의 집합을 저장하는 시스템 전체
    • Ex. MySQL, PostgreSQL 등
  • 스키마 : DB 내의 구조를 정의하는 방식
    • Ex. ID, 이름, 이메일 등

MySQL vs PostgreSQL

MySQL

  • 장점
    • 간단하고 빠른 데이터 처리
      단점
    • 복잡한 쿼리 처리기능이 PostgreSQL 비해 상대적으로 낮음
    • 상업 사용할시 비용발생

PostgreSQL

  • 장점
    • 대규모 애플리케이션에 적합
    • 복잡한 데이터 처리, 확작성
    • 완전한 무료로 오픈 소스
  • 단점
    • 쓰기성능이 MySQL에 비해 느림
    • 학습에 대한 러닝커브가 존재
    • 관련 커뮤니티의 부족

Transaction에 대해 설명해 주세요.

  • DB의 상태변화를 발생시키는 작업의 단위
  • SQL 질의어(select, insert,delete, update)의 조합
  • 단, 작업의 단위는 질의어 한문장이 아니라, 개발자가 설정한 SQL 명령문들의 조합
    - 예를들어서 사용자가 게시글을 작성하고 다시 게시판에 돌아왔을때를 살펴보면, 작업의 단위는 게시글 정보를 insert하고 select로 게시판을 보여주게되는데 insert와 select가 따로가아닌 하나로 묶어서 하나의 작업단위 즉, 트랜잭션이라한다.
    하나의 트랜잭션을 잘 설계하는 것이 데이터를 다루는데 중요하다

트랜잭션의 4가지 특징

ACID

  • Atomicity(원자성) : 트랜잭션 내의 모든 작업은 전부 성공 혹은 실패
  • Consistency(일관성) : 트랜잭선 전후의 DB 상태가 항상 일관적
  • Isolation(격리성) : 트랜잭션 간은 간섭없이 독립적
  • Durablility(지속성) : 성공한 트랜잭션은 DB에 영구적으로 반영

ORM vs SQL Mapper에 대해 설명해 주세요.

ORM

  • ORM(Object Relational Mappipng, 객체 관계 매핑) : Object와 DB 테이블을 매핑해서 데이터를 객체화시키는 기술
  • DBMS에 종속적이지 않고, 개발 언어에 더 가까운 모습을 보인다. ex) JPA, Django ORM(Python)
  • 장점 :
    • 객체지향 코드 작성 가능
    • 유지보수성 증가
    • DBMS에 대해 독립적
      • SQL문을 사용하지 않기에 어떤 DBMS에 대해서도 사용가능
  • 단점 :
    • 높은 학습 난이도
    • 복잡한 쿼리 해결이 어려움

SQL Mapper

  • DB의 데이터를 개발자가 작성한 SQL로 매핑시켜주는 프레임워크, 즉 개발자가 직접 SQL을 작성해 DB를 다룬다.
  • 객체와 테이블 간의 관계를 매핑하는 것이아니고, SQL을 작성해서 쿼리 수행 결과를 어떤 객체에 매핑할지 바인딩 하는 방법
  • DBMS에 종속적이다 ex) SpringJdbcTemplate, MyBatis
  • 장점 :
    • SQL 작성에 제약이 없다
    • 세부적인 SQL 변경 편리
    • 다양한 테이블 조합 가능
    • 쉬운 학습 난이도
  • 단점 :
    • SQL 관련 유지보수성이 낮음
    • DBMS에 종속적이라 DBMS 변경시 재사용이 어려움
      • SQL문을 직접 작성해야하기에 DBMS마다 사용이 다름
    • 개발자가 직접 SQL을 작성해야한다.
    • 객체와 테이블간 패러다임 불일치가 발생한다.
      - 패러다임 불일치 : 패러다임 불일치는 객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르므로 둘의 구조와 표현 방법이 다른것을 말합니다. 객체지향과 데이터 중심의 DB간 불일치
      jdbc -> SQL Mapper -> ORM 형태로 발전

RDBMS와 NoSQL의 특징과 장단점을 각각 설명해주세요.

RDBMS

  • 관계형 데이터베이스 ex) MySQL, MariaDB, PostgreSQL
  • 데이터의 규칙이 정해진 스키마에 의해 테이블에 저장
  • 관계를 통해 여러 테이블에 분산되어 저장
  • 장점 :
    • 스키마가 명확하게 정의되어 있음
    • 데이터의 무결성을 보장
    • 정규화를 통해 데이터를 중복없이 한 번만 저장
  • 단점 :
    • 스키마가 정해져있기에 유연성이 떨어짐
    • 추후 스키마의 수정이 힘듬
    • 관계가 많은 경우 복잡한 쿼리문 필요 -> DB 성능악화 및 문제 발생 가능성 증가
    • 수직적 확장에 최적(SSD 추가 / CPU 업그레이드 등)

NoSQL

  • 비관계형 데이터베이스 ex> MongoDB, Redis, Firebase
  • 관계형을 제외한 나머지 데이터베이스
  • 관계가 없어서 유연하게 데이터 저장 가능
  • 장점 :
    • 스키마가 없기 때문에 추후 변경 및 필드 추가에 용이
    • 관계가 존재하지 않기에 수직적 뿐만아니라 서버추가와 같은 수평적 확장에도 용이
    • 애플리케이션에서 원하는 유형으로 데이터를 저장하기에 저장 속도가 빠르다 ex) JSON
  • 단점 :
    • 스키마가 정해져 있지 않아, 데이터에 대한 규격화가 없음
    • 데이터의 중복을 허용하기에 수정 작업이 번거로움 -> 하나를 수정하면 모든 컬렉션에서 수정을 수행

키의 종류

  • 슈퍼 키 : 테이블에서 고유성을 보장하는 키들의 집합
    • 유일성 O, 최소성 X
  • 후보 키 : 기본키가 될 수 있는 모든 키
    • 유일성 O, 최소성 O
  • 기본 키 : 각 행을 고유하게 식별, NULL 및 중복 불허
  • 대체 키 : 후보 키 중에 기본키로 사용되지 않은 키
  • 왜래 키 : 다른 테이블의 기본키를 참조하는 키, 테이블 간 과계 정의
  • 복합 키 : 여러 컬럼을 조합하여 고유성을 보장하는 키

- 유일성 : 각행을 유일하게 식별하는 성질
- 최소성 : 불필요한 속성들이 포함되지 않는 성질
  Ex. ID로 충분히 식별가능한데 (ID,이름)과 같은 복합키로 사용하는 것은 유일성은 만족하겠지만 최소성은 만족하지 못하는 것 

정규화 과정과 역 정규화에 대해 설명해주세요.

정규화(Nomalization) : RDBMS에서 중복을 최소화하도록 데이터를 구조화하는 프로세스(과정)를 말한다.

기본형

  • 제 1 정규화 : 모든 속성의 도메인이 분해되지 않은 원자값으로만 이루어지도록 분해
    • 테이블의 컬럼이 하나의 값만 갖도록 분해
  • 제 2 정규화 : 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되도록 부분 함수 종속을 제거
    • A,B 컬럼이 C를 정하고 있는데 B 컬럼이 D를 정해준다면 분해
  • 제 3 정규화 : 이행적 함수 종속을 없애도로 분해
    • A컬럼이 B를 정하는데 B컬럼이 C 를 정하는 A -> B -> C 의 구조가 된어서 A-C 관계가 된다면 분해 / Why) 그렇다면 B가 변경되었을때 번거로움
  • BCNF(보이스/코드 정규화) : 함수 종속 관계에서 모든 결정자가 후보키가 되도록 분해
    • A,B 컬럼이 C를 결정해주고 있는데 C가 B를 정해주고 있는 상황
      C는 결정자이지만 후보키(기본키)가 아니기때문에 분해

고급형

  • 제 4 정규화 : 다치 종속 제거
    • 다치 종속 : 하나의 기본키로 여러 컬럼을 결정하는것
      Ex. 한 테이블에서 학생ID가 취미와 언어를 결정한다면, (ID,취미), (ID,언어)로 분리
  • 제 5 정규화 : 조인 종속 제거
    • 조인 종속 : A라는 릴레이션을 B와 C로 분해했다가 다시 조인했을 때 그대로 A가 된다면, A는 조인 종속성이 있다고 한다.
      Ex. 조인으로 필요한 데이터를 완전하게 만들 수 있다면 컬럼을 분리

정규화 직접 경험해본적 있나?

Ex. 음식과 재료에 대한 테이블 설계 중, 재료가 또다른 재료에 대해서 만들어지는 경우가 존재했음, 예를 들어서, 토마토 소스는 재료이면서 토마토를 통해서 만들어지는 재료였습니다. 이러한 상황을 포함시킬 수 있도록 기본 재료 테이블과 조합 재료 테이블로 나누어서 관리함, 3정규화 원칙 충족(기본키에 종속되도록)

정규화 장단점

  • 장점 : 이상 현상이 발생하는 가능성을 줄임
  • 단점 : 정규화 과정에서 여러 테이블로 분해가 되기에 연산 속도가 느려짐

역정규화

  • 중복을 제거하기위한 정규화 과정에서 오히려 연산 속도가 느려지는 상황을 개선시키기 위함
  • 중복을 허용하거나 분리된 테이블들을 합쳐서 DB 성능 향상

데이터베이스를 공격하는 해킹 기법은 무엇이라고 하나요?

대표적인 SQL Injection (SQL 삽입 공격)

  • 코드 주입 공격 기법에서 파생된 해킹 기법
  • 공격 난이도는 쉬우나 그 파급력이 치명적
  • 데이터베이스 시스템에 비정상적인 SQL 쿼리를 주입하여, 보안상 취약점을 이용해 데이터베이스를 조작
  • 테스트를 통한 취약점 판별을 어렵지만, 스캐닝 툴과 코드 검증 절차를 통해 취약점을 빠르게 판별 가능
  • ex) SQL 명령문에
INSERT INTO Students (이름) VALUES (”PUT NAME”);

이름을 넣어야할 곳에 테이블을 삭제하라는 명령을 주입하게된다면 학생의 기록은 모두 삭제된다.


조인에 대해 설명해주세요.

  • 두개 이상의 테이블이나 데이터베이스를 연결해서 데이터를 검색하는 방법
    • ex) A와 B의 공통된 데이터를 찾아주시오
  • 테이블을 연결하기위해서는 적어도 하나의 컬럼을 공유하고 있어야 하므로, 데이터 검색에 활용한다.

조인의 종류

  • INNER JOIN : 두 테이블 사이의 공통된 값을 가진 행을 반환한다(교집합)
  • LEFT OUTER JOIN : 왼쪽테이블 모든 행 + 두 테이블의 공통된 행을 반환한다. 일치하는 항목이 없으면 왼쪽 테이블의 열에 대해 null 값 반환
  • RIGHT OUTER JOIN : 오른쪽 테이블 모든 행 + 두 테이블의 공통된 행을 반환, 일치하는 항목이 없으면 오른쪽 테이블의 열에 대해 null 값 반환
  • FULL OUTER JOIN : 두 테이블의 모든 행을 반환, 일치하지않는다면 일치하지 않는 테이블의 열에 대해 null 값 반환.
  • CROSS JOIN : 모든 경우의 수를 전부 반환, A가 3 이고 B가 4이면 총 12개의 데이터를 반환
  • SELF JOIN : 자기 자신과 조인, 자신의 컬럼을 변형시켜서 활용할때 사용

Index에 대해 설명해주시고, 장/단점에 대해 아는대로 말해주세요.

Index

  • 테이블을 처음부터 끝까지 검색하는 방법인 FTS(Full Table Scan)과는 달리 인덱스를 검색하여 해당 자료의 테이블을 엑세스 하는 방법입니다.
  • 배열에 접근할때에 인덱스로 접근하는 방식을 생각하면 됩니다.

인덱스는 항상 정렬된 상태를 유지하기 때문에 원하는 값을 검색하는데 빠르지만, 새로운 값을 추가하거나 삭제, 수정하는 경우에는 쿼리문 실행 속도가 느려집니다.
즉, 인덱스는 데이터의 저장 성능을 희생하고 그대신 데이터의 검색 속도를 높이는 기능이라 할 수 있습니다.

인덱스 생성문
CREATE INDEX idx_employee_name ON employees (name);
로 인덱스를 생성하고 관련 SQL문을 실행할때 자동으로 옵티마이저가 적절한 인덱스를 사용해서 탐색한다.

DBMS에서는 B+Tree 인덱스 자료구조와 해시 테이블을 이용해서 관리하고있습니다.


인덱스의 종류

인덱스 종류

  • 기본 인덱스
    • 기본 키에 대해 자동으로 생성되는 인덱스
  • 유니크 인덱스
    • 컬럼값이 유일하도록 보장하는 인덱스, Unique 속성에 대해 자동 생성
  • 보조 인덱스
    • 기본키, 유니크 키 이외에 추가적인 생성된 인덱스
    • 주로 쿼리 튜닝을 위해 사용

인덱스 형태

  • 클러스터드 인덱스(Clustered Index)
    • 테이블의 데이터 자체가 인덱스에 포함되어 정렬되어 실제로 저장된 인덱스
    • 한 테이블의 하나만 생성, 주로 기본 키에 대해 생성됨
  • 비클러스터드 인덱스(Non-Clustered Index)
    • 개발자에 의해 추가적으로 생성되는 인덱스
    • 별도의 자료구조로 저장
    • 인덱스는 실제 데이터의 주소를 참조
      • 실제 데이터가 저장되는 것은 아님
    • 테이블당 여러개 생성 가능

그렇다면, 기본 인덱스 = 클러스터드 인덱스 && 보조 인덱스 = 비클러스터드 인덱스 인가?

비슷한 느낌이지만, 기본 인덱스와 보조 인덱스는 DB에서 인덱스의 목적에 따른 정의라고 생각
즉, 기본 인덱스와 보조 인덱스는 인터페이스 개념에 가깝고, 클러스터드 인덱스와 비클러스터드 인덱스는 구현체에 가까운 개념이라고 생각한다.

인덱스를 사용할때 오히려 느린 경우를 설명해주세요.

일반적인 DBMS의 옵티마이저에서는 인덱스를 통해 레코드 1건을 읽는 것이 테이블에서 직접 레코드를 1건 읽는 것보다 4~5배정도 비용이 더 많이 드는 작업으로 예측한다.
때문에, 인덱스를 통해서 읽어야 할 레코드의 건수가 전체 테이블 레코드의 20%~25%를 넘어서면 인덱스를 사용하지 않고 테이블을 모두 읽어서 필요한 레코드를 가려내는 필터링 방식으로 처리하는 것이 효율적이다.
옵티마이저 : 가장 효율적인 방법으로 SQL을 수행할 최적의 처리 경로를 생성해주는 DBMS의 핵심 엔진


Delete / Truncate / Drop의 차이점에 대해 설명해주세요.

DELETE

  • WHERE 절을 사용하여 테이블에 있는 데이터를 하나하나 선택하여 제거
  • WHERE 절을 사용하지 않더라도 내부적으로 하나씩 제거
  • 속도가 늦기때문에 원하는 데이터만 삭제할때 사용
  • COMMIT 전이라면 ROLLBACK 명령어를 통해 되돌릴 수 있다.

TURNCATE

  • 테이블 내에 모든 데이터를 한번에 삭제하는 방식
  • 자동 COMMIT이 되는 명령어 이므로, 지운후에는 되돌릴 수 없다.
  • 처음 테이블을 생성한 시점으로 되돌림

DROP

  • 인덱스를 포함한 테이블 자체를 완전히 제거
  • 자동 COMMIT이 되는 명령어 이므로, 지운 후엔 되돌릴 수 없다.

DB의 트랜잭션 조작어(TCL)에 대해 설명해주세요.

TCL : Transaction Control Language

COMMIT / SAVEPOINT / ROLLBACK

  • COMMIT : 하나의 트랜잭션을 물리적인 데이터베이스에 적용하는 작업으로 마지막 COMMIT 시점 이후 실행한 트랜잭션 결과를 데이터베이스에 영구적으로 저장한다.
    그러므로 마지막 COMMIT 시점 까지만 ROLLBACK이 가능하다
    코드) COMMIT;
  • SAVEPOINT : SAVEPOINT를 지정하면 ROLLBACK시 해당 지정 위치로 복원이 가능하여 SAVEPOINT 명령어로 지점을 지정, ROLLBACK 명령어로 복원한다.
    코드) SAVEPOINT SV1;
  • ROLLBACK : 데이터의 수정, 삭제, 삽입 등의 작업을 한 후 원래의 상태로 되돌릴 때 사용하는 작업이다. COMMIT 이후에는 ROLLBACK 하더라도 이전으로 돌아갈 수 없다.
    코드)
    ROLLBACK;
    ROLLBACK TO SV1;
    주의할점 : 세이브포인트를 지정한 후에 커밋을 한다면 롤백을 사용해도 세이브포인트로 돌아갈 수 없다 => 커밋이후에는 마지막 커밋지점으로밖에 돌아갈 수 없다.

SQL 문법 종류

  • DDL
    • CREATE
    • DROP
    • ALTER
      -TRUNCATE
  • DML
    • INSERT
    • SELECT
    • UPDATE
    • DELETE
  • DCL
    • GRANT
    • REVOKE
  • TCL
    • COMMIT
    • SAVEPOINT
    • ROLLBACK

DB를 설계할때 가장 중요한 것에 대해 설명해주세요.

데이터 무결성을 보장해야 합니다.

  • 무결성 : 데이터의 정확성, 일관성, 유효성이 유지되는 것을 의미합니다.
  • 정확성 : 데이터의 중복이나 누락이 없는 상태
  • 일관성 : 데이터가 변하지 않는 상태를 보장
    데이터베이스에 데이터 무결성을 설계하지 않는다면, 테이블에 중복된 데이터가 존재하고 부모와 자식 데이터 간의 관계가 깨지고 잦은 에러와 재개발 비용 발생 등과 같은 문제가 발생할 수 있다.

데이터 무결성 제약조건 종류

  • 개체 무결성 :
    • 기본 키에 관련된 무결성 / 기본키 : 레코드를 구별하기 위해 후보키 중에 선택된 식별자 키
    • 테이블은 기본 키를 지정하고 그에따른 무결성 원칙을 지켜야한다.
    • 기본 키는 Null이 올 수 없다.
    • 하나의 테이블에 동일한 기본 키를 갖을 수 없다.
  • 참조 무결성 :
    • 외래 키에 관련된 무결성 / 외래키 : 한테이블의 키 중에서 다른 테이블의 레코드를 유일하게 식별할 수 있는 키
    • 외래키는 Null이거나 참조 릴레이션의 기본키 값과 동일해야 한다.
    • 외래 키 속성은 참조할 수 없는 값을 지닐 수 없다 -> 외래키 속성 값이 상위 테이블의 인스턴스에 반드시 존재하거나 Null 이어야한다.
  • 도메인(속성) 무결성 :
    • 컬럼에 저장되는 값이 정해진 데이터 타입, 크기, 제약조건을 만족해야함
    • 필드의 타입과 관련한 사항을 정의하고 올바른 데이터가 입력되었는지 확인
  • Null 무결성 :
    • 특정 속성 값이 Null이 될 수 없게 하는 조건
  • 고유 무결성
    • 테이블의 특정 속성에 대해 각 레코드들이 갖는 값들이 서로 달라야 하는 조건
  • 키 무결성 :
    • 하나의 테이블에는 적어도 하나의 키가 존재해야 하는 조건
  • 관계 무결성 :
    - 테이블에 한 레코드의 삽입 가능 여부 확인하는 조건
    - 다른 테이블과의 관계에 대한 적절성 여부를 지정한 조건

트랜잭션 격리수준(Isolation Level)

태랜잭션 격리수준이란, DB에서 동시에 실행되는 트랜잭션 간의 격리성을 책임지는 정도를 설정하는 규칙

  • Read Uncommitted
    • 커밋하지 않아도 읽기 가능
    • Dirty Read 발생가능
  • Read committed(오라클의 기본 격리 수준)
    • 커밋된 데이터만 읽을 수 있음
    • Non-Repeatable Read 발생 가능
  • Repeatable Read(MySQL의 기본 격리 수준)
    • 하나의 트랜잭션이 시작되었을때의 그 시점으로 가장 최근에 커밋내역에 대해서만 읽음
    • 하나의 트랜잭션 내에서 반복해서 읽어도 같은 결과를 보장
    • Phantom Read 발생 가능
  • Serializable
    • 트랜잭션이 접근해있다면 다른 트랜잭션은 완전히 차단

격리수준에 따른 문제점

  • Dirty Read
    • 커밋되지 않은 데이터를 읽는 상황
      Ex. 롤백시 잘못된 데이터 사용가능
  • Non-Repeatable Read
    • 같은 조회를 반복하면 결과가 달라짐
      Ex. 중간에 다른 트랜잭션이 커밋하면 달라짐
  • Pantom Read
    • 같은 SQL을 실행했는데 데이터의 수가 행의 수가 달라짐
    • 즉, 없던 데이터가 생기거나 있던 데이터가 사라지는 상황
      Ex. 중간에 다른 트랜잭션이 데이터를 삽입(insert)하거나 제거(delete)하는 상황

Lock 이란?

DB에 여러 트랜잭션이 동시에 접근할때, 무결성과 일관성을 보장하기 위해 사용되는 솔루션
크게 공유락과 배타락이 존재한다.

Lock 종류 설명

락의 종류는 크게 공유락과 배타락으로 나눠진다.

  • 공유락
    • 읽기 작업에 사용
    • 여러 트랜잭션이 동시에 데이터를 읽는 것은 허용하지만, 동시에 쓰기 작업은 불가능
  • 배타락
    • 쓰기 작업에 사용
    • 트랜잭션이 쓰기 작업을 수행할때 다른 트랜잭션이 접근하지 못하도록 함
    • 읽기, 쓰기 둘다 수행 불가
    • 때문에, 동시성이 낮아져 성능이 저하될 수도 있음

Lock 문제를 해결할때 고려할 점

  • 성능
    • 너무 많은 락을 사용하게 되면 성능이 저하될 수 있기때문에, 필요한에 한정하여 락을 사용
  • 트랜잭션의 크기
    • 트랜잭션의 크기가 크다면 자원을 오래 점유하게 되므로, 가능한 작은 단위로
  • 격리 수준
    • DB의 격리 수준에 따라 락의 강도(어떤 것에 락을 걸지)를 결정하기 때문에 적절한 격리 수준을 선택하는 것이 중요

Blocking 이란?

하나의 트랜잭션이 데이터에 Lock을 걸고 있는 동안 다른 트랜잭션이 동일한 데이터에 접근하려고 할 때 발생하는 상태

Blocking은 언제 발생하는지?

한 트랜잭션이 배타락을 걸었다면, 다른 트랜잭션이 동일한 데이터에 접근할 수 없고 이를 Blocking이라고 한다.

교착상태란?

서로 다른 두 개 이상의 트랜잭션이 서로의 자원을 기다리게되어 무한정 대기하는 상태
Ex. A는 a에 대한 락을 보유하고 b에 접근하려 한다. B는 b에 대한 락을 보유하고 a에 접근하려 한다. 서로의 자원이 해제될때까지 무한정 대기 -> 교착상태

교착상태 4가지 필요 조건

  • 상호 배제
    • 한 리소스에 하나의 프로세스만
  • 점유와 대기
    • 하나를 보유하고 다른 자원을 점유하기 위해 대기
  • 비선점
    • 할당된 자원을 강제로 뺏을 수 없다
  • 환형 대기
    • 순환 형태로 자원을 대기한다.
    • 1이 2를 원하고, 2는 3을 원하는 형태

교착상태를 해결하기 위한 방법

  • 타임아웃
    • 일정 시간 동안 트랜잭션이 완료되지 않으면 강제로 중단시키는 방법
    • 간단하지만, 최적의 방법은 아니다.
  • 교착상태 예방
    • 교착 상태가 발생할 수 있는 4가지 조건 중 한 가지의 조건을 제거
    • 자원 낭비가 심함
  • 교착상태 탐지 및 회복
    • 탐지 : 교착상태가 발생했는지를 확인 -> 매번 실행하면 오버헤드 발생
    • 회복 : 교착상태를 일으킨 프로세스를 종료 및 선점하도록하여 회복
  • 교착상태 회피
    • 교착상태가 발생할 가능성이 있는 자원에 할당 하지 않는다
    • 은행원 알고리즘
profile
멋있는 사람 - 일단 하자

0개의 댓글