Transaction

코끼릭·2022년 11월 6일
0

IT

목록 보기
17/24

Transaction란?

데이터베이스에서의 병행제어 및 회복작업의 논리적인 단위로 하나의 트랜잭션은 하나 이상의 DML들로 구성되어 있다. 애플리케이션이 작업하는 논리적인 하나의 작업은 여러 DML로 이뤄져 있는 경우가 많고 이 작업 단위를 기준으로 회복작업과 병행제어를 해야 되기 때문에 이를 관리하기 위한 작업의 단위를 트랜잭션으로 정의하고 아래 나열된 4가지 원칙을 기준으로 트랜잭션을 관리한다.

Atomicity (원자성)

하나의 트랜잭션을 이루는 DML은 트랜잭션이 성공한 경우에는 전부 반영되어야 하고 실패한 경우에는 모두 반영되지 않아야 한다.

Consistent (일관성)

트랜잭션이 성공한 경우 데이터베이스 상태는 일관된 상태를 유지해야 된다.

Durability (영속성)

성공한 트랜잭션의 결과는 영구적으로 반영되어야 한다.

Isolation (독립성)

둘 이상의 트랜잭션이 동시에 실행되는 경우 각 트랜잭션이 다른 트랜잭션 연산에 영향을 줘서는 안된다.

데이터베이스 격리수준

동시에 실행되는 각 트랜잭션의 작업이 다른 트랜잭션에 주는 영향의 정도인 격리수준은 4가지로 구분할 수 있다. 격리수준이 낮을수록 트랜잭션의 동시성이 높아지고 격리수준이 높아질수록 트랜잭션의 동시성이 낮아지는 특징을 가진다.

Read Uncommitted

커밋되지 않는 다른 트랜잭션의 작업도 영향을 받는 가장 낮은 격리수준으로 다음 이상 현상이 발생한다.

  • dirty read
    다른 트랜잭션의 쓰기 작업을 읽는 격리성이 보장되지 않는 현상
  • non repeatable read
    두 번의 조회가 각각 다른 결과가 나오는 일관성이 보장되지 않는 현상으로 처음 조회에 포함된 row가 두 번째 조회를 수행하기 전 다른 트랜잭션에 의해 update될 경우 나타나게 된다.
  • phantom read
    두 번의 조회에서 존재하지 않는 row가 등장하는 현상으로 처음 조회에 존재하지 않은 row가 두 번째 조회를 수행하기 전 다른 트랜잭션에 의해 insert될 경우 나타나게 된다.

Read Committed

Oracle에서 제공되는 격리수준으로 다른 트랜잭션에서 커밋된 작업에 영향을 받을 수 있어 다음 이상 현상이 발생한다.

  • non repeatable read
  • phantom read

Repeatable Read

MySQL에서 제공되는 격리수준으로 Read Committed 격리수준에서 현재 작업 중인 트랜잭션에서 조회하는 row의 수정을 다른 트랜잭션이 수정하지 않는다. 하지만 다른 트랜잭션이 새로운 row를 insert하는 것을 허용하기 때문에 다음 이상 현상이 발생한다.

  • phantom read

Serialiazable

테이블에 하나의 트랜잭션만 접근할 수 있는 가장 높은 격리수준이지만 동시성이 낮기 때문에 read uncommitted와 같이 사용이 되지 않는 격리수준이다.

MySQL의 Lock

MySQL의 InnoDB의 경우 트랜잭션 간의 Repeatable Read의 격리수준을 지키고 다른 트랜잭션로 인해 새로운 row가 읽어지는 phantom read를 방지하기 위해 다음과 같은 락 방식을 제공하고 있다.

  • Shared & Exclusive Locks
    row-level lock으로 공유락을 가진 트랜잭션만 row를 읽을 수 있고 공유락의 경우 여러 트랜잭션이 얻을 수 있다. 배타락의 경우 배타락을 가진 트랜잭션만 row를 수정하거나 삭제가 가능하고 여러 트랜잭션이 가질 수 없기 때문에 사용이 완료될 때까지 다른 트랜잭션은 기다려야 한다.
  • Record Locks
    인덱스를 기준으로 레코드에 걸 수 있는 락으로 다른 트랜잭션이 동일한 인덱스를 가진 row에 대한 생성, 수정, 삭제를 방지할 수 있다. 테이블에 인덱스가 없더라도 innoDB에서 숨겨진 인덱스를 생성하고 사용해서 레코드 락으로 사용한다.
  • Gap Locks
    인덱스를 기준으로 일정 범위 안에 포함된 레코드에 걸 수 있는 record Lock이다. where 절 범위에 포함되는 여러 row들에 대한 생성, 수정, 삭제를 다른 트랜잭션이 하지 못하도록 제어한다.
  • Next-Key Locks
    Record Locks과 Gap Locks의 조합으로 하나의 트랜잭션이 공유락이나 배타락을 가지고 있으면 다른 트랜잭션은 락을 가지고 있는 레코드의 주변에 새로운 레코드를 넣을 수 없도록 제어한다. 여기서 말하는 주변이란 인덱스를 기준으로 정렬했을 때 인덱스 사이 구간의 인덱스 값을 의미해서 테이블에 인덱스값으로 10, 11, 13, 20이 있는 경우 (처음, 10], (10,11], (11,13], (13,20], (20, 끝)의 간격으로 구간 락을 이루게 된다.

ACID
격리수준
Transactional Isolation Level
MySQL Lock

profile
ㅇㅅㅇ

0개의 댓글