ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 트랜잭션
    김영한의 스프링/데이터베이스 2024. 9. 12. 21:12

    데이터를 단순히 파일에 저장해도 상관없는데 우리는 왜 굳이 데이터베이스에 저장을 할까? 가장 큰 이유는 트랜잭션 개념을 지원하기 때문이다. 그렇다면 트랜잭션은 무엇인가? 이제 부터 트랜잭션에 대해 알아보자

     

    트랜잭션 탄생

    트랜잭션을 해석하면 거래이다. 쉽게 생각하면 데이터베이스에서 트랜젝션은 하나의 거래를 안전하게 처리하도록 보장해주는 것이다. 예를 들어 A라는 사람이 B에게 2000원 계좌이체를 한다고 가정하자. 그러면 A의 잔고는 2000원 줄어들고 B의 잔고는 2000원 늘어야한다. 하지만 만약 A의 잔고는 2000원 줄어들었는데 B의 잔고는 그대로라면 심각한 문제이다. 이 과정에서 트랜잭션을 이용하면 만약 A의 잔고가 줄어들고 B가 늘어나지 않았으면 이전에 A의 잔고가 줄어든 것을 무효화 시킨다. 즉, 두 과정 모두 성공해야 데이터베이스에 저장이 되고 둘 과정 중 하나라도 실패할 경우에는 거래 이전의 상태로 돌아오게 된다. 이렇게 데이터베이스에 정상적으로 반영하는 것을 커밋(Commit) 하나라도 실패해서 이전으로 돌아간다면 롤백(Rollback)이라고 한다.

     

    트랜잭션 ACID

    트랜잭션은 ACID를 보장해야한다. ACID는 줄임말로 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 보장하는 것이다.

    • 원자성 : 트랜잭션 내에서 실행한 작업들은 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야한다.
    • 일관성 : 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야한다.
    • 격리성 : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리해야한다. 쉽게 얘기하면 여러 트랜잭션에서 하나의 데이터를 동시에 수정을 하는 것을 막아야한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준을 선택할 수 있다.
    • 지속성 : 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야한다. 중간에 시스템 문제가 발생해도 데이터베이스 로그 등을 사용해서 트랜잭션 내용을 복구해야한다.

    트랜잭션은 원자성, 일관성, 지속성을 보장한다. 하지만 격리성을 완전히 보장하기 위해서는 트랜잭션을 실행된 순서대로 진행해야한다. 그렇게 하면 동시 처리 성능이 매우 나빠진다. 그렇기에 ANSI 표준은 트랜잭션 격리 수준은 4단계로 나누어 정리했다. 격리 수준은 "망나니 개발자"님의 포스팅을 참고하자!

     

     

    [MySQL] 트랜잭션의 격리 수준(Isolation Level)에 대해 쉽고 완벽하게 이해하기

    이번에는 트랜잭션 격리 수준(Isolation Level)에 대해 알아보도록 하겠습니다. 아래의 내용은 RealMySQL과 MySQL 공식 문서 등을 참고하여 작성하였으며, 모든 내용은 InnoDB를 기준으로 설명합니다. 해

    mangkyu.tistory.com

     

    데이터베이스 연결 구조와 DB 세션

     

    사용자는 웹 애플리케이션 서버(WAS)나 DB 접근 툴 같은 클라이언트를 사용해서 데이터베이스 서버에 접근할 수 있다. 클라이언트는 데이터베이스 서버에 연결을 요청하고 커넥션을 맺는다. 동시에 데이터베이스 서버는 내부에 세션을 만든다. 그 후 해당 커넥션을 통한 모든 요청은 이 세션을 통해 실행된다. 세션은 트랜잭션을 시작하고 커밋 혹은 롤백을 통해 트랜잭션을 종료하게된다. 만약 사용자가 커넥션을 닫거나 DB 관리자가 세션을 강제로 종료하면 세션을 종료되게 된다. 쉽게 요약하자면 개발자가 클라이언트를 통해 SQL을 전달하면 현재 커넥션에 연결된 세션이 이를 실행하고 책임진다.

     

    이렇게 기본적인 트랜잭션 개념에 대해 살펴보았다. 그렇다면 애플리케이션에서 트랜잭션을 어떤 계층에 걸어야할까? 어디에서 트랜잭션을 시작하고 어디에서 커밋을 해야할까?

    트랜잭션 적용

    위 질문의 대답은 비즈니스 로직이 있는 서비스 계층에서 시작해야한다.

     

    비즈니스 로직이 잘못되면 해당 비즈니스 로직으로 인해 문제가 되는 부분을 롤백해야하기 때문에 서비스 계층에서 시작해야한다. 트랜잭션을 시작하려면 커넥션이 필요하다. 애플리케이션에서 DB 트랜잭션을 사용하려면 트랜잭션을 사용하는 동안 같은 커넥션 즉, 같은 데이터베이스 서버의 세션을 사용해야한다. 애플리케이션에서 같은 커넥션을 쉽게 사용할 수 있도록 스프링은 몇 가지 기능을 제공한다. 다음 포스트에서 정확히 알아보자! ㅎㅎ

Designed by Tistory.