트랜잭션

Minseo Kang·2023년 5월 2일
0
post-thumbnail

01. 트랜잭션 개념 이해


데이터를 파일로 저장하지 않고 데이터베이스에 저장하는 이유는

데이터베이스는 트랜잭션이라는 개념을 지원하기 때문이다.


그럼, 트랜잭션이란?

하나의 거래를 안전하게 처리하도록 보장해주는 것이다.


하나의 거래를 안전하게 처리하는 것에 있어서 문제가 발생하는 경우를 살펴보면, 대표적인 예로 계좌이체를 들 수 있다.




02. 트랜잭션 개념 이해 예시 - 계좌이체


A가 B에게 5000원을 송금한다고 가정해보자. 그렇다면 수행되는 작업은

  1. A의 계좌에서는 5000원이 출금된다.
  2. B의 계좌에는 5000원이 입금된다.

로 정의할 수 있다. 이 두 개의 작업이 합쳐져서 하나의 작업처럼 동작해야 한다. 1번 작업은 성공했는데 2번 작업을 실패했다면 A의 잔고만 줄어드는 문제가 발생한다.


데이터베이스에서 제공하는 트랜잭션 기능을 사용하면, 위의 예시에서 두 개의 작업이 함께 성공해야 저장하고, 거래가 실패하면 거래 전의 상태로 돌아갈 수 있다.

모든 작업이 성공해서 데이터베이스에 정상적으로 반영하는 것을 커밋(Commit) 이라고 한다. 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것을 롤백(Rollback)이라고 한다.




03. 트랜잭션 ACID


트랜잭션은 ACID를 보장해야 한다. 각각을 살펴보면 다음과 같다.


원자성(Atomicity)

  • 트랜잭션 내의 작업들은 마치 하나의 작업인 것 처럼 모두 성공하거나 모두 실패해야 한다. 트랜잭션의 원자성 덕분에 여러 SQL 명령어를 하나의 작업처럼 처리할 수 있었다.

일관성(Consistency)

  • 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예로 데이터베이스의 무결성 제약 조건을 만족하는 것을 들 수 있다.

격리성(Isolation)

  • 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다.

지속성(Durability)

  • 트랜잭션을 성공적으로 끝내면 결과는 항상 기록되어야 한다.



04. 트랜잭션 격리 수준 - Isolation level


트랜잭션은 원자성, 일관성, 지속성은 보장하지만, 격리성이 문제가 된다. 트랜잭션 간에 격리성을 완전히 보장하기 위해서는 트랜잭션을 거의 순서대로 실행해야 한다. 하지만 이렇게 처리하면 동시 처리 성능이 매우 나빠진다. ANSI 표준은 트랜잭션 격리 수준을 4단계로 나누어 정의했다.


  1. READ UNCOMMITED(커밋되지 않은 읽기)
  2. READ COMMITED(커밋된 읽기)
  3. REPEATABLE READ(반복 가능한 읽기)
  4. SERIALIZABLE(직렬화 가능)



05. 트랜잭션 시작 및 사용법


트랜잭션 시작

계좌이체와 같은 작업을 수행할 때는 반드시 수동 커밋 모드를 사용해야 한다. 수동 커밋 모드를 사용해서 수동으로 커밋, 롤백이 가능하도록 가능하도록 해야한다. 자동 커밋모드에서 수동 커밋 모드로 전환 하는 것을 트랜잭션을 시작한다고 한다.


트랜잭션 사용법

데이터 변경 쿼리를 실행하고 DB에 해당 결과를 반영하고 싶으면 커밋 명령어인 commit을 호출한다. 결과를 반영하고 싶지 않으면 롤백 명령어인 rollback을 호출한다.
커밋을 호출하기 전까지는 임시로 데이터를 저장하는 것이다. 해당 트랜잭션을 시작한 세션 혹은 사용자에게만 변경 데이터가 보이고 다른 세션 혹은 사용자에게는 변경 데이터가 보이지 않는다.

0개의 댓글