티스토리 뷰

Java+Spring/Spring

[Spring]트랜잭션(Transaction)

Vagabund.Gni 2022. 9. 5. 21:19
728x90
반응형

목차

     

     

     

     

    트랜잭션이란 더 이상 쪼갤 수 없는 일처리의 최소 단위를 뜻한다.

     

    이전에 SQL에 대해 알아볼 때 등장한 적이 있다.

     

    2022.08.05 - [개발/Database] - [데이터베이스]SQL

     

    [데이터베이스]SQL

    SQL(Structured Query Language - 구조화된 쿼리 언어)은 데이터베이스용 프로그램 언어이다. 에스큐엘 혹은 시퀄이라고 읽으며, 데이터베이스 시스템에서 자료를 처리하는 용도로 사용된다. 이름에서

    gnidinger.tistory.com

    예를 들어 A의 계좌에서 B의 계좌로 만 원을 이체할 때,

     

    송금 도중 알 수 없는 오류가 발생해서 A 계좌에서 출금은 되었으나 B 계좌에는 입금되지 않았다고 하자.

     

    이때 이체가 모두 성공적으로 끝난 후에야 이를 완전한 거래로 승인하고,

     

    송금 도중 오류가 발생했을 때는 거래 전체를 없었던 것으로 되돌리도록 설정해 문제를 예방할 수 있다.

     

    이처럼 여러 개의 작업을 하나의 그룹으로 묶어 더 이상 쪼갤 수 없도록 만든 것트랜잭션이라고 하며,

     

    트랜잭션은 위에 예를 들었듯이 모두 성공하거나 모두 실패하는(All or Nothing) 작업으로 처리된다.

     

    ACID Principles

     

    트랜잭션은 위와 같은 안정성을 보장하기 위해 네 가지 특징을 가진다.

     

    이들의 앞 글자를 따 ACID Principles라 부르며, 대략적인 내용은 아래와 같다.

     

    원자성(Atomicity)

     

    원자성은 앞서 살펴봤던 트랜잭션의 정의-더 이상 쪼갤 수 없는 일처리의 최소 단위-를 말한다.

     

    하나의 트랜잭션으로 묶인 작업은 하나의 원자로 인식해서 전부 성공하거나 전부 실패하는 것(All or Nothing)이 보장된다.

     

    일관성(Consistency)

     

    여기서 일관성이란 데이터베이스의 일관성을 말한다.

     

    더 정확하게는 데이터베이스에 대한 비즈니스 로직이 트랜잭션 전후로 일관되어야 한다는 원칙이다.

     

    고립성(Isolation)

     

    모든 트랜잭션은 다른 트랜잭션의 영향을 받지 않고 독립적으로 존재한다.

     

    한 번에 여러 클라이언트가 다양한 요청을 해도 각 요청에 대한 트랜잭션은 고립되어 있다는 뜻이다.

     

    지속성(Durability)

     

    성공한 트랜잭션의 결과는 안정적으로 보존되어야 한다.

     

    작업 도중 시스템 오류가 발생하더라도 물리적인 기록은 영구적으로 유지되어야 한다.

     

    또한 데이터베이스는 트랜잭션의 ACID 원칙을 지원하기 위한 모듈을 가지고 있는데,

     

    간략하게 보면 아래와 같다.

     

    Commit & Rollback

     

     

    Commit

     

    커밋 연산은 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어로서

     

    처리 결과를 데이터베이스에 영구적으로 저장하고 트랜잭션 과정을 종료할 때 사용한다.

     

    당연히 커밋을 수행하지 않으면 결과가 데이터베이스에 반영되지 않는다.

     

    Rollback

     

    롤백 연산은 작업 중 문제가 발생하여 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어이다.

     

    트랜잭션의 일부가 정상적으로 처리됐다고 하더라도 원자성에 의해 모든 연산이 취소되는 특징을 가지고 있다.

     

    때문에 롤백 연산이 실행되면 데이터베이스는 트랜잭션 이전 상태, 즉 마지막 커밋을 완료한 시점으로 돌아간다.

     

    javax.persistence.entitytransaction.commit()

     

    지난 글에서 JPA를 체험하며 사용했던 commit() 메서드는 내부적으로 어떤 과정을 거치며 동작하는지 살펴보자.

     

    위 그림은 EntityTransaction을 상속받아 구현하는 구현 클래스에 대한 다이어그램이다.

     

    Hibernate ORM 영역과 JDBC API 영역이 뒤섞여 있는데, 그림에서 표시하면 아래와 같다.

     

    계속해서 우리가 궁금해하는 commit() 메서드는 위 그림 중 TransactionImpl에서 시작한다.

     

    작업을 순서대로 요약해보자.

     

    1. TransactionImpl

      • EntityTransaction 객체로 commit()을 호출하면 그 구현 클래스인 TransactionImpl의 commit()이 호출됨
      • 내부적으로 트랜잭션 드라이버 구현 객체(TransactionDriverControlImpl)를 얻은 후 다시 commit() 호출
    2. JdbcResourceLocalTransactionCoordinatorImpl > TransactionDriverControlImpl

      • JdbcResourceLocalTransactionCoordinatorImpl의 내부 클래스 TransactionDriverControlImpl은 JdbcResourceTransaction의 구현 객체인 AbstractLogicalConnectionImplementor의 commit() 호출
    3. AbstractLogicalConnectionImplementor

      • 물리적인 JDBC Connection을 얻은 후 connection 객체의 commit() 호출
    4. JdbcConnection

      • 데이터베이스에 commit 명령어를 준비한 후 실행
    5. Command

      • DB에 commit을 전달하기 위해 commitIfNonTransactional() 메서드 호출
      • commitIfNonTransactional() 메서드는 내부적으로 auto commit 여부를 체크한 뒤,
        데이터베이스 세션에 해당하는 Session 객체를 통해 commit 명령 수행
      • commitIfNonTransactional() 수행 과정에서 예외가 발생하면 rollback 수행
    6. SessionLocal

      • 트랜잭션에 대한 commit 수행

    JPA를 사용해서 간단하게 작성했던 commit이 내부적으로 복잡한 과정을 거치는 것을 확인할 수 있었다.

     

    또한 이전 글에서 확인했듯이 JPAHibernate를 거쳐 JDBC를 통해 DB에 접근하는 것도 볼 수 있었다.

     

     

    Summary

     

    • 트랜잭션이란 더 이상 쪼갤 수 없는 일처리의 최소 단위를 뜻한다.
    • 트랜잭션은 안정성을 보장하기 위해 ACID Principles를 갖는다.
    • 커밋롤백은 트랜잭션을 제어하는 명령어이다.
    • JPAHibernate의 구현을 거쳐 JDBC를 통해 DB와 상호작용 한다.
    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/06   »
    1
    2 3 4 5 6 7 8
    9 10 11 12 13 14 15
    16 17 18 19 20 21 22
    23 24 25 26 27 28 29
    30
    글 보관함