데이터베이스(DB)

도니·2022년 4월 12일
0

데이터베이스는 전자적으로 저장되는 구조화된 정보 또는 데이터의 조직화된 모음

데이터베이스 정의

데이터베이스는 일반적으로 데이터베이스 관리 시스템(DBMS)에 의해 관리 및 제어가 됨.
보통은 DBMS와 데이터베이스 등을 한대로 묶어 데이터베이스 시스템이라고 하며 단축해서 데이터베이스라고 함.


트랜잭션(Transaction) 정의

데이터베이스의 상태를 변화시키는 하나의 작업 단위를 의미한다.

작업의 단위는 딱 한개의 일이 아니라 일련의 행위들을 한데 묶은 것이다.
아래는 하나의 작업이다.

  1. A라는 사람이 B라는 사람에게 돈을 보내기 위해 계좌를 확인한다
  2. B라는 사람에게 이체를 하고 남은 금액으로 A의 통장이 업데이트 된다.
  3. B라는 사람이 잔액을 확인한다.

이와 같은 전체 행동을 합친 것이 하나의 작업이다.

Commit, Rollback

하나의 트랜잭션은 모든 것이 정상적으로 처리되어 Commit이 되거나 비정상적으로 처리되어 모든게 취소가 되는 Rollback 두 개의 행동이 있다.

  • Commit : 한 개의 트랜잭션이 정상적으로 종료가되어 데이터베이스가 일관된 상태에 있을 때 완료된 것을 알려주는 연산
  • Rollback : 한 개의 트랜잭션이 실패하여 일관성을 깨트릴 때 트랜잭션을 처음부터 다시 수행하거나 지금까지의 행위로 변경된 결과 등을 전부 되돌린다.

트랜잭션의 성질

원자성, 일관성, 독립성, 지속성

트랜잭션의 성질은 크게 4가지로 원자성, 일관성, 독립성, 지속성이 있다.

  • 원자성 : 트랜잭션의 동작 중 발생된 작업들은 데이터베이스에 모두 반영되던가 전부 반영되지 않아야한다는 특징이다.
  • 일관성 : 트랜잭션이 끝난 후에도 데이터베이스가 일관된 상태로 유지 되어야한다는 특징이다. 트랜잭션 전, 후 데이터 모델의 모든 제약 조건을 만족해야한다.
  • 독립성 : 트랜잭션이 실행되는 도중에 변경한 데이터는 해당 트랜잭션이 완료되기 전까진 다른 트랙잭션이 참조하지 못한다. (병렬처리 방버에서 발생, 해결방법으로는 여러 locking 방법이 있음)
  • 지속성 : 성공적으로 수행된 트랜잭션은 영원히 반영이 된다. Commit이 되면 해당 상태가 보장이 된다.

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

여러 트랜잭션들이 동시에 처리 될 때 트랜잭션끼리 얼마나 독립성을 가지고 있는지 나타내는 것

크게 4개의 Isolation Level로 나뉨

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

Isolation Level 은 동시성과 데이터 무결성 사이에서의 조율이라 조심할 필요가 있다. 일반적으로 Serializable이 제일 고립정도가 높고 성능이 떨어진다.

Read Uncommitted

Read Uncommitted 격리 수준에서는 다른 트랜잭션에서 Commit 이전에 처리 중인 변경된 데이터도 확인 할 수 있다.
해당 레벨에서는 Dirty Read가 발생 할 수 있다.

  1. A 트랜잭션에서 C 데이터를 변경함
  2. 아직 커밋 하지 않음
  3. B 트랜잭션이 C의 데이터를 조회함
  4. A 트랜잭션이 오류가 발생해 Rollback함
  5. B 트랜잭션은 계속 변경된 데이터로 로직 수행됨

이렇듯 데이터 무결성이 어긋나는 경우가 발생함

Read Committed

Commit이 완료된 트랜잭션만 조회활 수 있다. 트랜잭션이 수행되는 동안에 다른 트랜잭션은 접근 할 수 없어 대기하고 있다.
SQL Server, Oracle DB등에서 기본적으로 사용하는 격리수준이다.
Non-Repeatable Read(조회를 할 때마다 값이 변경될 수 있다)가 발생하는 레벨이다.

  • 예시
    1. A트랜잭션 C 데이터 조회함
    1. C데이터 조회됨
    2. B트랜잭션에서 C 데이터 변경하고 커밋
    3. A트랜잭션에서 C 데이터를 다시 조회함
    4. B트랜잭션이 변경한 데이터가 조회가 됨

Repeatable Read

트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있는 격리 수준이다. MySQL에서 기본으로 사용하는 격리 수준이다. 해당 격리 수준에서는 Non-Repeatable READ가 발생하지 않는다.

  • 예시
    1. A트랜잭션 C 데이터 조회함
    2. C데이터 조회됨
    3. B트랜잭션에서 C 데이터 변경하고 커밋
    4. A트랜잭션에서 C 데이터를 다시 조회함
    5. Undo 영역에 있는 백업된 데이터를 A트랜잭션에 반환됨

해당 격리 수준은 자신의 트랜잭션보다 낮은 트랜잭션 번호에서 변경된 것 만 보게 된다.
다만 해당 격리까지는 트랜잭션 도중에 Insert가 되기 때문에 Phantom Read는 계속 존재한다.

  • Phantom Read : 한 트랜잭션 내에 동일한 쿼리가 있을 때 반환된 결과가 상이한 것을 의미

Serializable

가장 단순하고 가장 엄격한 격리 수준으로써 한 트랙잭션이 처리 될 때 영향이 있는 레코드에는 다른 트랜잭션들이 일체 접근을 할 수가 없다.
그렇기 때문에 다른 격리들 보다 동시처리 능력이 떨어지고 성능저하가 발생한다.

profile
세상만사에 호기심

0개의 댓글