데이터베이스 트랜잭션(Database Transaction)

dgh03207·2022년 5월 31일
0

CS

목록 보기
6/6

트랜잭션(Transaction)

트랜잭션이란,

데이터베이스 상태를 변환시키기 위해 독립적으로 실행되는 논리 단위, 혹은 ‘작업단위’라고도 한다.

데이터베이스의 트랜잭션은 ACID 라는 약어로 분류되는 특성을 가지고 있다.

Atomic(원자성) , Consistent(일관성) , Isolated(격리) , Durable(내구성) 이 이것이다.

ACID

Atomic(원자성)

하나의 트랜잭션이 더 작게 나눌 수 없는 최소의 단위라는 뜻으로, 이 트랜잭션이 모두 반영되거나, 혹은 전혀 반영되지 않아야 하는 특징을 말한다. 그래서 트랜잭션 내에서 실행한 작업들은 하나의 작업인것처럼 모두 성공하거나 모두 실패해야한다.

계좌이체를 한다면, 송금하는 이의 계좌에서 돈이 빠져나가면, 송금받는 이의 계좌에는 돈이 들어가야한다.

Consistency(일관성)

트랜잭션과 상관없이 일관적인 데이터베이스의 상태를 유지하는 것을 말한다.
현재 데이터베이스의 상태를 어기는 트랜잭션의 겨우, 커밋되지 않는다.

전화번호 열에 숫자만 입력될 수 있도록 설정이 되어있다면, 일관성 때문에, 허용하지 않는 다른 문자를 입력하려는 트랜잭션은 커밋되지 않을 수 있다.

Isolated(격리)

트랜잭션 데이터는 원래 트랜잭션이 커밋되거나 롤백될 때까지 다른 트랜잭션에서 사용할 수 없다. 즉, 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리하는데, 이때 격리성은 동시성과 관련된 성능 이슈로 격리 수준을 선택할 수 있다.

계좌이체 도중, 계좌의 잔액을 조회한다거나 하는 작업을 동시에 수행할 수 없게 된다.

Durability(지속성)

트랜잭션을 성공한 후 데이터베이스에 반영된 것은 영원히 반영되어야 한다. 즉, 시스템에 문제가 발생하거나 종료되더라도 즉, 장애가 발생하더라도, 트랜잭션 데이터 변경이 가능해야한다. 그래서 트랜잭션이 성공적으로 끝나면, 이 결과가 기록되어야 하고, 문제가 발생해도 이 로그로 복구가 가능하도록 해야한다.

은행에 시스템 마비가 발생하더라도, 계좌의 금액이 바뀌면 안된다.

트랜잭션의 격리수준

트랜잭션간 격리성을 보장하기위해서, 트랜잭션을 차례대로 처리하면 성능 저하가 발생한다. 그래서 ANSI 표준은 트랜잭션의 격리 수준을 4가지로 나누어 정의한다.

격리 수준이 낮은 것 부터 높은 것 순으로 나열하면 READ UNCOMMITED < READ COMMITED < REPEATABLE READ < SERIALIZABLE 이다. 격리 수준이 낮을수록 동시성이 증가하지만, 격리 수준에 따라 다양한 문제가 있다. 문제는 DIRTY READ , NON-REPEATABLE READ , PHANTOM READ 가 있다.

READ UNCOMMITED

커밋하지 않은 데이터를 읽을 수 있음.

발생가능 문제 : DIRTY READ

커밋되지 않은 데이터를 읽어왔기 때문에, 읽어온 데이터가 정상적으로 데이터베이스에 저장되어있는 데이터인지, 아니면 중간에 문제가 생겨서 정상적으로 commit되지 않아 rollback된 데이터인지 알 수 없다.

이처럼, 트랜잭션에서 처리한 작업이 완료되지 않았음에도 다른 트랜잭션에서 볼 수 있게 되는 현상을 DIRTY READ 라고 한다.

READ COMMITTED

가장 많이 선택되는 격리 수준으로, 커밋한 데이터만 읽을 수 있다.

발생가능 문제 : NON-REPEATABLE READ

그래서, 같은 데이터에 대해서 다시 조회했을때, 다른 값이 읽힐 수 있다. 예를 들면, 회원번호 10번인 JOLIN 회원에 대해서 조회하는데, 이 회원의 이름을 TED 로 변경한후, 커밋하였다. 그러면, 나는 같은 10번 회원을 조회하였지만 TED 로 변경된 값을 읽어오는 것이다.

이처럼, 반복해서 같은 데이터를 읽을 수 없는 상태를 NON-REPEATABLE READ 라고 한다.

REPEATABLE READ

한번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회되도록 하는 것이다.

발생가능 문제 : PHANTOM READ

트랜잭션 1이 10살 이하의 회원을 조회했는데, 트랜잭션 2가 5살 회원을 추가하고 커밋하면 트랜잭션 1이 다시 이 회원을 조회했을때, 다른 회원이 추가된 상태로 조회된다. 즉, 반복 조회 시 결과 집합이 달라지는 것을 의미한다.

이 작업이 금전적문제로 이어지면, 다른 트랜잭션에서 입출금이 계속 진행되고 있는데, 내 트랜잭션에서 오늘 입금된 금액의 총합을 조회하려고 한다고 하자. 그런데, REPEATABLE READ 에의해서 격리 수준이 보장되지 않으면 커밋할때마다 값이 다르게 보여지는 문제가 발생할 수 있다.

이처럼 반복 조회 시 결과 집합이 달라지는 것을 PHANTOM READ 라고 한다.

SERIALIZABLE

가장 엄격한 트랜잭션 수준으로, 말그대로 차례대로 트랜잭션이 처리되는 것이다. 하지만 동시성 처리 성능이 급격히 떨어진다.

Lock의 종류로 Shared Lock(공유락)Exclusive Lock(베타락) 이 존재한다. 이것은 다른말로, Read LockWrite Lock 으로도 불린다. 공유락과 베타락은 동시사용이 불가능하다.

Shared Lock(공유락)

데이터를 읽을 때, 사용되는 Lock으로, 공유 Lock 끼리는 동시 접근이 가능하다. 즉, 하나의 데이터를 읽는 데 여러 사용자가 동시에 읽을 수 있다.

Exclusive Lock(베타락)

데이터를 변경할때, 사용되는 락으로 트랜잭션이 완료될때까지 유지된다. 락이 해지되기 전까지 다른 트랜잭션은 해당 리소스에 접근할 수 없게된다.

Lock의 설정 범위

  • 데이터베이스
  • 파일
  • 테이블
  • 페이지와 블럭
  • 컬럼
  • 행(Row)

데드락

교착상태는 두 트랜잭션이 각각 Lock을 설정하고 다음 서로의 Lock에 접근하여 값을 얻어오려고할때 각각의 트랜잭션에 의해 Lock이 설정되어있어 양쪽 모두 영원히 처리가 되지 않는 상태를 말한다.

Reference

profile
같이 공부하자!

0개의 댓글