Database
Transation
- 트랜잭션은 업무 처리를 위한 논리적인 작업 단위
- 작업의 논리적 단위가 단일 연산이 아닐 수 있음
- 은행의 “계좌이체” 트랜잭션을 예를 들면, 하나의 예금 계좌에서 인출하여 다른 예금 계좌에 입금하는 일련의 작업을 하나의 단위로 수행
ACID
- Atomicity(원자성)
- 트랜젹션은 더 이상 분해가 불가능한 업무의 최소단위이므로, 전부 처리되거나 아예 하나도 처리되지 않아야 함
- 트랜잭션의 모든 연산들이 정상적으로 수행 완료되거나 아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장
- Consistency(일관성)
- 트랜잭션의 수행을 데이터베이스 상태 간의 전이(transition)로 봤을 때, 트랜잭션 수행 전후의 데이터베이스 상태는 각각 일관성이 보장
- 일관된 상태의 데이터베이스에서 하나의 트랜잭션을 성공적으로 완료하고 나면 그 데이터베이스는 여전히 일관된 상태여야 함
- 트랜잭션 실행의 결과로 데이터베이스 상태가 모순되지 않아야 함
- Isolation(격리성)
- 여러 트랜잭션이 동시에 수행되더라도 각각의 트랜잭션은 다른 트랜잭션의 수행에 영향을 받지 않고 독립적으로 수행
- 실행 중인 트랜잭션의 중간결과를 다른 트랜잭션이 접근할 수 없음
- Durability(영구성)
- 트랜잭션이 성공적으로 완료되어 커밋되고 나면, 해당 트랜잭션에 의한 모든 변경은 향후에 어떤 소프트웨어나 하드웨어 장애가 발생되더라도 보존
- 트랜잭션이 일단 그 실행을 성공적으로 완료하면 그 결과는 데이터베이스에 영속적으로 저장
낮은 단계의 격리성 수준에서 발생할 수 있는 현상
- Dirty Read
- 다른 트랜잭션에 의해 수정됐지만 아직 커밋되지 않은 데이터를 읽는 것을 말함
- 변경 후 아직 커밋되지 않은 값을 읽었는데 변경을 가한 트랜잭션이 최종적으로 롤백된다면 그 값을 읽은 트랜잭션은 비일관성 상태에 놓임
- Non Repeatable Read
- 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 두 쿼리 결과가 다르게 나타나는 현상
- Phantom Read
- 한 트랜잭션 내에서 같은 쿼리를 두번 수행했는데, 첫 번째 쿼리에서 없던 유령 레코드가 두번째 쿼리에서 나타나는 현상
Transaction Isolation Level
- Read uncommitted
- 트랜잭션에 처리중인 혹은 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용
- 어떤 사용자가 A라는 데이터를 B라는 데이터로 변경하는 동안 다른 사용자는 B라는 아직 완료되지 않은(Uncommitted 혹은 Dirty) 데이터 B를 읽을 수 있음
- Read committed
- 트랜잭션이 커밋되어 확정된 데이터만을 읽는 것을 허용
- dirty read 방지
- Repeatable read
- 하나의 트랜잭션이 읽는 로우를 다른 트랜잭션이 수정하는 것을 막음
- 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정이 불가능
- 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제하는 것을 불허함으로써 같은 데이터를 두 번 쿼리했을 때 일관성 있는 결과를 리턴함
- Serializable
- 트랜잭션을 순차적으로 진행
- 완벽한 읽기 일관성 모드를 제공
| Isolation Level | Dirty Read | Nonrepeatable Read | Phantom Read | Serialization Anomaly |
|---|---|---|---|---|
| Read uncommitted | Possible | Possible | Possible | Possible |
| Read committed | Not possible | Possible | Possible | Possible |
| Repeatable read | Not possible | Not possible | Possible | Possible |
| Serializable | Not possible | Not possible | Not possible | Not possible |
선택도
- 테이블의 특정 열을 기준으로 해당 열의 조건절에 따라 선택되는 데이터 비율
카디널리티
- 카디널리티 = 전체 데이터 건 수 * 선택도
- 중복도가 높으면 카디널리티가 낮고 중복도가 낮으면 카디털리티가 높음
- 주민번호 > 높음, 이름 > 중간, 성별 > 낮음