Spring JDBC 05 - JDBC Transaction

Transaction

데이터를 저장할 때 단순히 파일에 저장해도 되는데, 데이터베이스에 저장하는 이유는 무엇일까? 여러가지 이유가 있지만, 가장 대표적인 이유는 바로 데이터베이스는 트랜잭션이라는 개념을 지원하기 때문이다. 트랜잭션을 이름 그대로 번역하면 거래라는 뜻이다. 이것을 쉽게 풀어서 이야기하면, 데이터베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것을 뜻한다. 그런데 하나의 거래를 안전하게 처리하려면 생각보다 고려해야 할 점이 많다. 예를 들어서 A의 5000원을 B에게 계좌이체한다고 생각해보자. A의 잔고를 5000원 감소하고, B의 잔고를 5000원 증가해야한다.

5000 계좌이체

  • A의 잔고를 5000원 감소
  • B의 잔고를 5000원 증가

계좌이체라는 거래는 이렇게 2가지 작업이 합쳐져서 하나의 작업처럼 동작해야 한다. 만약 1번은 성공했는데 2번에서시스템에 문제가 발생하면 계좌이체는 실패하고, A의 잔고만 5000원 감소하는 심각한 문제가 발생한다.

데이터베이스가 제공하는 트랜잭션 기능을 사용하면 1,2 둘다 함께 성공해야 저장하고, 중간에 하나라도 실패하면 거래전의 상태로 돌아갈 수 있다. 만약 1번은 성공했는데 2번에서 시스템에 문제가 발생하면 계좌이체는 실패하고, 거래 전의 상태로 완전히 돌아갈 수 있다. 결과적으로 A의 잔고가 감소하지 않는다.

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

트랜잭션 ACID

트랜잭션은 ACID(http://en.wikipedia.org/wiki/ACID라 하는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 보장해야 한다.)라 하는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 보장해야 한다.

  • *원자성:** 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공 하거나 모두 실패해야 한다.
  • *일관성:** 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
  • *격리성:** 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준(Isolationlevel)을 선택할 수 있다.
    • 예를 들면 하나의 데이터베이스에 여러명이 접근을 하게 되었을 때(Multi Therad)의 환경에서 같은 데이터를 수정하면 문제가 발생할 수 있다. → 그래서 격리가 필요하다.
    • 격리성은 동시에 트래픽이 접근 했을 때 한번에 하나씩 처리가 되어야 완벽한 격리라고 볼 수 있다.
    • 근데 Thread를 동시성과 관련하여 성능이슈 문제가 발생할 수 있다.
    • 격리성을 너무 고려하다 보면 한개의 트랜잭션을 수행하는데 있어서 많은 시간이 걸린다.
    • 따라서 격리성에도 어느정도 조건을 추가할 수 있다.
  • *지속성:** 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.

고민해 보아야 할 점

위에 문제에서 가장 고민해 보아야 할 점은 성능이슈와 관련된 격리성이다. 트랜잭션 관에 격리성을 완벽하게 보장하려면 순서대로 실행을 해야한다. Thread 100개에서 동시에 요청이 들어왔고 하나의 트랜잭션에서 예를들어 2초가 걸린다면 순번표를 뽑고 마지막 순번자는 200초를 기다려야 결과를 반환받을 수 있다. 따라서 하나의 트랜잭션을 수행하기 위한 성능과 격리성의 중점을 찾는 것이 중요하다.

Reference

김영한님의 스프링 강의 정리



© 2022. by taewoo

Powered by taewoo