DB Transaction(트랜잭션)

kangking·2024년 6월 24일
0

Spring Boot

목록 보기
5/10
post-thumbnail

DB Transaction(트랜잭션)

DB에서 수행하는 작업 단위

MySQL에서는 기본적으로 sql한 줄이 하나의 작업 단위로 설정되어 있음.

  • 기본적으로 오토커밋이 켜져있음(mysql,mariadb둘다)

  • 원래는 아래와 같이 원하는 만큼의 DB작업 단위(트랜잭션)를 명시적으로 묶어서 지정해줘야 함

    START TRACSACTION;
    SELECT * FROM product;
    COMMIT;
  • AUTOCOMMIT On,Off

    Set AUTOCOMMIT = false;
    Set AUTOCOMMIT = true;
  • JPA에서는 기본적으로 AUTOCOMMIT이 꺼져있다.

트랜잭션의 상태

commit이 완료되어야 정상적으로 트랜잭션이 마무리 된다. commit전 까진 복구나 철회가 가능하지만 commit 이후는 불가능하다.

트랜잭션의 특징

  • 원자성

    트랜잭션 내의 모든 내용이 적용되거나, 하나라도 안되면 모든 내용이 적용되지 않아야 한다.
    (하나의 트랜잭션은 하나의 덩어리라고 생각하면 된다)

  • 일관성

    작업 처리 결과가 항상 일관성이 있어야 한다.
    (제약조건과 관련있음)

    음수가 되면 안되는 값에 제약조건을 걸어서 같은 작업을 계속 수행하다가 제약조건을 위배하면 실행이 실패하도록 하여 결과의 일관성을 확보해야함)

  • 독립성

    어떤 트랜잭션이라도 다른 트랜잭션 연산 중간에 끼어들 수 없다.

  • 영구성

    트랜잭션이 완료되면 영구적으로 반영되어야 한다.
    (하드웨어랑 관련있음)

hibernate를 쓰면 entityManager를 직접 사용해야 하기 때문에 다소 어렵다.

핵심 키워드

  • @transactional

    해당 어노테이션이 붙은 대상이 호출하는 DB작업을 하나의 트랜잭션으로 묶어서 작업을 수행시킨다. 메소드에 붙어있다면, 해당 메소드가 return될 때 flush 후 commit 처리된다.

    이 때 원자성에 의해 여러개의 DB호출이 모두 성공해야 해당 메소드의 DB처리가 정상적으로 완료된다.

    readOnly = true 옵션으로 읽기 작업만 있을 때 성능을 높일 수 있다.

  • EntityManager

    hibernate가 구현해둔 구현체(Entity관리)
    hibernate는 여기 담아둔 객체나 데이터를 통해 CRUD등 DB작업을 수행한다.

    EntityManager는 EntityManegerFactory를 통해 클라이언트의 요청을 받아 하나씩 생성되며 각 EntityManager는 내부에 영속성 컨텍스트를 가지고 있다.

    또한 DB작업시 HikariCP가 만들어둔 Connection을 임대받는 대상이다.

  • flush

    쓰기 지연 쿼리에 담긴 쿼리를 실행하는 역할을 수행하며 스냅샷과 엔티티의 변경을 감지하고 update문을 만들어두기도 한다.

  • Transaction Commit

    트랜잭션을 마무리하는 단계로, 커밋 시점에 flush()메소드를 호출하여 변경감지, 쌓인 쿼리 실행, commit을 통한 실제 결과 반영 등의 기능을 수행한다.

profile
하루하루 의미있게

0개의 댓글