본문 바로가기
ComputerScience/Database

[DataBase] 2. 트랜잭션(Transaction)

by Develaniper 2021. 5. 31.

1. 트랜잭션

트랜잭션은 끊김없이 한번에 처리해야하는 업무의 단위를 의미한다. 데이터베이스에서의 트랜잭션은 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위를 말한다.

 

트랜잭션을 설명할 때 가장 대표적인 예시가 은행업무이다. 다음은 트랜잭션의 개념이 들어가지 않은 업무 처리의 예이다.

A가 자신의 계좌에서 B에게 송금을 하려고 한다.

송금을 하는 중 네트워크에 문제가 생겨 A의 잔고는 줄었지만 B에게 입금이 되지 않았다.

 

이럴 경우를 대비하여 A의 통장에서 금액이 빠진 후 B의 통장에 입금이 된 것이 확인 된다면 작업을 마치는 것을 트랜잭션이라고 한다. 만일 중간에 오류가 발생했다면 거래를 처음 상태로 복구시켜야 한다.

 

즉, 작업 처리에있어서 안정성을 확보하는 것을 말한다.

 

트랜잭션을 정리하면 다음과 같다.

- 데이터베이스 시스템에서 병행 제어 및 회복 작업 시처리되는 작업의 논리적 단위이다.

- 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과장의 작업단위이다.

- 하나의 트랜잭션은 Commit(적용)되거나 Rollback(취소)된다.

 

 

트랜잭션의 특징(성질)-ACID

  • 원자성(Automicity)
    • 트랜잭션 연산은 데이터베이스에 모두 반영이 되든지 아니면 전혀 반영되지 않아야 한다.
    • 즉, 트랜잭션의 명령은 끝까지 완벽히 수행되어야 하며, 오류가 있다면 트랜잭션이 모두 취소되어야 한다.
  • 일관성(Consistency)
    • 트랜잭션의 실행을 성공적으로 마치면 데이터베이스는 항상 일관성 있게 유지해야한다.
    • 즉, 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 후의 상태가 같아야 한다.
      (*고정요소 : 예를들어 잔고는 0과 양의 정수임을 유지해야한다.)
  • 독립성(isolation)
    • 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실험중에 다른 트랜잭션의 연산이 끼어들 수 없다.
    • 즉, 수행중인 트랜잭션이 완료될 때까지 다른 트랜잭션에서 수행 결과(사용 중인 테이블/데이터)를 참조할 수 없다.
  • 지속성(Durability)
    • 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 한다.

 

2. 연산 및 상태

- Commit

 하나의 트랜잭션이 성공적으로 끝났고 데이터베이스가 일관된 상태에 있을 때, 하나의 트랜잭션이 끝난 것을 알려주는 연산이다. 즉, 트랜잭션 작업이 정상적으로 완료되면 이 변경사항을 한번에 DB에 반영합니다.

이 연산을 마치면 수행된 트랜잭션이 로그에 저장되며, 나중에 Rollback 연산을 수행했던 트랜잭션 단위로 하는 것을 도와준다. 

- Rollback

트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상으로 처리되도 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소 하는 연산이다.

 Rollback시에는 해당 트랜잭션을 재시작하거나 폐기한다.

 

- SAVEPOINT

 일반적으로 ROLLBACK을 명시하면 INSERT, DELETE, UPDATE 등의 작업 전체가 취소되지만 SAVEPOINT를 사용하면 특정 부분까지 트랜잭션을 취소 할 수 있다.

또한 SAVEPOINT로 명시한 뒤 ROLLBACK TO 세이브포이트 이름;을 실행하면 해당 SAVEPOINT 지점까지 처리한 작업이 취소된다.

 

활서 : 트랜잭션이 정상적으로 실행중인 상태
실패 : 트랜잭션 실행 시 오류가 발생하여 중단된 상태
철회 : 트랜잭션이 비상적으로 종료되어 Rollback 연산을 수행한 상태
부분 완료 : 트랜잭션의 마지막 연산까지 실행했지만, Commit연산이 실행되기 직전의 상태
완료 : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태

 

3. 트랜잭션 격리 수준

트랜잭션 경리수준이란 동시에 트랜잭션이 여러개 처리될 때 특정 트랜잭션이 다른 트랜잭션이 변경/조회하는 데이터를 볼 수 있게 허용하는 수준을 결정하는 것이다.

 

트랜잭션 격리수준은 4단계로 나뉜다.

 

[출처]https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation

 

  • 각 TRANSACTION에서 변경내용이 COMMIT, ROLLBACK 상관없이 다른 트랜잭션에서 값을 읽을 수 있는 상태이다.
  • 위 그림과 같이 1번 트랜잭션에서 222데이터를 삽입하자마자(COMMIT을 안했어도) 2번 트랜잭션에서 사용하는 모습이다.
  • 1번 트랜잭션을 ROLLBACK할 경우, 1번 트랜잭션에서 222값을 다시 사용할 경우 문제가 된다.

2) READ COMMITTED

[출처]https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation

  • RDB에서 기본적으로 사용하는 격리수준이다.
  • 실제 테이블 값을 가져오는 것이 아니라 Undo 영역의 백업된 레코드에서 값을 가져온다.
  • 즉, 변경된 내용이 COMMIT 되어야만 다른 트랜잭션에서 조회할 수 있다.
  • 1번 트랜잭션이 COMMIT을 하기전과 후의 222데이터가 차이나기 때문에 2번 트랜잭션에서 1번 트랜잭션의 커밋 전과 후에 각각 222를 사용하면 문제가 생긴다.

 

3) REPEATABLE READ

[출처]https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation

  • 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있는 격리 수준.
  • MySQL에서는 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게함.
  • PHANTOM READ 발생
    PHANTOM READ란 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안보였다가 하는 현상
    이를 방지하기 위해 쓰기 잠금을 걸어야 함

[출처]https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation

위 그림을 설명하면 트랜잭션2에서 먼저 222테이블을 사용한다(트랜잭션 수행 전 COMMIT이 된 후라서 사용가능). 이때 트랜잭션1이 해당 테이블을 변경한다. 트랜잭션2는 아직 끝나지 않은 상태에서 222 테이블을 다시 참조하면 값이 달라지는 것을 볼 수 있다.

4) SERIALIZABLE

  • 트랜잭션이 완료될 때까지 다른 트랜잭션이 해당 영역에 대해 수정 및 입력을 할 수 없다.
  • 가장 단순하고 엄격한 격리 수준
  • 성능면에서 동시처리 성능이 가장 낮다.

 

 

출처

https://velog.io/@issac/DB-트랜잭션-Transaction의-ACID-속성과-분산시스템-BASE-속성
https://devuna.tistory.com/30
https://mommoo.tistory.com/62
https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation

참고자료

https://victorydntmd.tistory.com/129(데드락)

'ComputerScience > Database' 카테고리의 다른 글

[DataBase] 6. 조인(JOIN)  (0) 2021.06.03
[DataBase] 5. 파티셔닝/ 샤딩  (0) 2021.06.03
[DataBase] 4. 정규화  (0) 2021.06.03
[DataBase] 3. 스키마  (0) 2021.06.03
[Database] 1. Index  (0) 2021.05.31

댓글