Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Databae] 트랜잭션 발생 문제 정리 #68

Merged
merged 4 commits into from
Sep 4, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 57 additions & 19 deletions contents/database/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,13 +235,12 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데

### 반정규화 개념

반정규화란 시스템의 성능 향상, 개발 및 운영의 편의성등을 위해 정규화된 데이터모델을 통합, 중복, 분리하는 과정으로 의도적으로 정규화 원칙을 위배하는 행위이다.
반정규화란 시스템의 성능 향상, 개발 및 운영의 편의성 등을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정으로 의도적으로 정규화 원칙을 위배하는 행위이다.

* 반정규화를 수행하면 시스템의 성능이 향상되고 관리 효율성은 증가하지만, 데이터의 일관성과 정합성은 저하될 수 있다.
* 과도한 반정규화는 성능을 저하시킨다.
* 반정규화를 위해서는 사전에 **데이터의 일관성과 무결성을 우선으로 할지, 데이터베이스의 성능과 단순화를 우선**으로 할지 생각한다.
* 반정규화 방법에는 테이블 통합, 테이블 분할, 중복 데이블 추가, 중복 송성 추가 등이 있다.

* 반정규화를 위해서는 사전에 **데이터의 일관성과 무결성을 우선으로 할지, 데이터베이스의 성능과 단순화를 우선으로 할지** 생각한다.
* 반정규화 방법에는 테이블 통합, 테이블 분할, 중복 테이블 추가, 중복 속성 추가 등이 있다.

### 테이블 통합

Expand All @@ -251,27 +250,25 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데
#### 테이블 통합 시 고려사항

* 검색은 간편하지만, 레코드 증가로 인해 처리량이 증가한다.
* 데이블 통합으로 인해 입력, 수정, 삭제 규칙이 복잡해질 수 있다.

* 테이블 통합으로 인해 입력, 수정, 삭제 규칙이 복잡해질 수 있다.

### 테이블 분할

테이블을 수직 또는 수평으로 분할하는 것이다.

1. **수평 분할** : 레코드를 기준으로 테이블을 분할한다.
2. **수직 분할** : 하나의 테이블에 속성이 너무 많을 경우 속성을 기준으로 테이블을 분할한다.
* `갱신위주의 속성 분할` : 데이터 갱신 시 레코드 잠금으로 인해 다른 작업을 수행 할 수 없으므로 갱신이 자주 일어나느 속성들을 수직 분할하여 사용한다.
* `갱신위주의 속성 분할` : 데이터 갱신 시 레코드 잠금으로 인해 다른 작업을 수행 할 수 없으므로 갱신이 자주 일어나는 속성들을 수직 분할하여 사용한다.
* `자주 조회되는 속성 분할` : 테이블에서 자주 조회되는 속성이 극히 일부일 경우 자주 사용되는 속성들을 수직분할하여 사용한다.
* `크기가 큰 속성 분할` : 이미지, 2GB 이상 저장될 수 있는 텍스트 형식으로 된 속성들을 수직분할하여 사용한다.
* `보안을 적용해야 하는 속성 분할` : 데이블 내의 특정 속성에 대해 보안을 적용할 수 없으므로 보안을 적용해야 하는 속성들을 수직분할 하여 사용한다.
* `보안을 적용해야 하는 속성 분할` : 테이블 내의 특정 속성에 대해 보안을 적용할 수 없으므로 보안을 적용해야 하는 속성들을 수직분할 하여 사용한다.

#### 테이블 분할 시 고려사항

* 기본키의 유일성 관리가 어려워진다.
* 데이터양이 적거나 사용빈도가 낮은 경우 테이블 분할이 필요한지를 고려해야한다.
* 분할된 테이블로 인해 수행속도가 느려질 수 있다.
* 검색에 중점을 두어 테이블 분할 여부를 결정해야한다.

* 데이터 양이 적거나 사용 빈도가 낮은 경우 테이블 분할이 필요한 지를 고려해야한다.
* 분할된 테이블로 인해 수행 속도가 느려질 수 있다.
* 검색에 중점을 두어 테이블 분할 여부를 결정해야 한다.

### 중복 테이블 추가

Expand All @@ -281,16 +278,17 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데
* 정규화로 인해 수행 속도가 느려지는 경우
* 많은 범위의 데이터를 자주 처리해야하는 경우
* 특정 범위의 데이터만 자주 처리해야 하는 경우
* 처리 범위를 줄이지 않고는 수행속도를 개선할 수 없는 경우
* 처리 범위를 줄이지 않고는 수행 속도를 개선할 수 없는 경우

2. 중복 테이블을 추가하는 방법
* `집계 테이블의 추가` : 집계 데이터를 위한 테이블을 생성하고, 각 원본 테이블에 트리거를 설정하여 사용하는 것으로, 트리거의 오버헤드에 유의한다.
* `진행 테이블의 추가` : 이력 관리 등의 목적으로 추가하는 테이블로, 적절한 데이터 양의 유지와 활용도를 높이기 위해 기본키를 적절히 설정한다.
* `특정 부분만을 포함하는 테이블의 추가` : 데이터가 많은 테이블의 특정부분만을 사용하는 경우 해당 부분만으로 새로운 테이블을 생성한다.
* `특정 부분만을 포함하는 테이블의 추가` : 데이터가 많은 테이블의 특정 부분만을 사용하는 경우 해당 부분만으로 새로운 테이블을 생성한다.

### 중복 속성 추가

조인해서 데이터를 처리할 때 데이터를 조회하는 경로를 단축하기 위해 자주 사용하는 속성을 하나 더 추가하는 것이다.

> 중복 속성을 추가하면 데이터의 무결성 확보가 어렵고, 디스크 공간이 추가로 필요하다.

1. 중복 속성을 추가하는 경우
Expand All @@ -300,14 +298,10 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데
* 기본키의 형태가 적절하지 않거나 여러 개의 속성으로 구성된 경우

2. 중복 속성 추가 시 고려 사항
* 데이블 중복과 속성의 중복을 고려한다.
* 테이블 중복과 속성의 중복을 고려한다.
* 데이터 일관성 및 무결성에 유의해야 한다.
* 저장공간의 지나친 낭비를 고려한다.

### Reference

- 2021 시나공 정보처리기사 필기

---

## 인덱스 (Index)
Expand All @@ -320,6 +314,50 @@ RDBMS는 테이블 기반(Table based) DBMS로, 테이블들의 집합으로 데

## 트랜잭션(Transaction)과 교착상태

트랜잭션이란? 데이터베이스의 상태를 변화시키기 위해 수행되는 작업의 논리적 단위이다.

### ACID

- Atomicity(원자성) : 트랜잭션에 해당하는 작업 내용이 (모두 성공했을 시) 모두 반영되거나, (하나라도 실패했을 시) 모두 반영되지 않아야 한다.
- Consistency(일관성) : 트랜잭션 처리 결과는 항상 데이터의 일관성을 보장해야 한다.
- Isolation(고립성) : 둘 이상의 트랜잭션이 동시에 실행되고 있을 때, 각 트랜잭션은 서로 간섭 없이 독립적으로 수행되어야 한다.
- Durability(지속성) : 트랜잭션이 성공적으로 완료된다면, 그 결과가 데이터베이스에 영구적으로 반영되어야 한다.

#### 주의사항

Isolation(고립성)을 보장하기 위해 무차별적으로 Lock을 걸다보면 대기시간이 매우 길어지므로 트랜잭션은 최소한으로 사용해야한다.

### 트랜잭션 상태

![image](https://user-images.githubusercontent.com/22047374/125165837-a951ee00-e1d3-11eb-9b0b-486cc5eff6b2.png)

- Active : 트랜잭션이 실행중인 상태(SQL 실행)
- Parital Commit : 트랜잭션의 마지막 연산까지 실행했지만, commit 연산이 실행되기 직전의 상태
- Commited : 트랜잭션이 성공적으로 종료되고 commit 연산까지 실행 완료된 상태
- Failed : 트랜잭션 실행에 오류가 발생한 상태
- Aborted: 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태

1. Commit : 데이터베이스 내의 연산이 성공적으로 종료되어 연산에 의한 수정 내용을 지속적으로 유지하기 위한 명령어이다.
2. Rollback : 데이터베이스 내의 연산이 비정상적으로 종료되거나 정상적으로 수행이 되었다 하더라도 수행되기 이전의 상태로 되돌리기 위해 연산 내용을 취소할 때 사용하는 명령어이다.

### 트랜잭션에서 발생할 수 있는 문제들

#### Dirty Read Problem

한 트랜잭션 진행 중에 변경한 값을 다른 트랜잭션에서 읽을 때 발생한다.
커밋되지 않은 상태의 트랜잭션을 다른 트랜잭션에서 읽을 수 있을 때 발생하는 문제이다.

#### Non-repeatable Read Problem

한 트랜잭션에서 같은 값을 두 번 이상 읽었을 때 그 값이 다른 경우를 말한다.
한 트랜잭션 도중 다른 트랜잭션이 커밋되면 발생할 수 있는 문제이다.

#### Phantom Read Problem

한 트랜잭션에서 같은 쿼리문을 두 번 이상 실행했을 때 새로운 데이터가 조회되는 경우를 말한다.
A 트랜잭션 도중 B 트랜잭션에서 update 쿼리를 수행하고 커밋하더라도 A 트랜잭션에서 그 결과는 볼 수 없지만,
A 트랜잭션 도중 B 트랜잭션에서 insert 쿼리를 수행할 경우 A 트랜잭션에서 처음에 안 보였던 새로운 데이터가 조회될 수 있다.

---

## NoSQL
Expand Down