본문 바로가기
java

[JAVA] 트랜잭션

by CodeMango 2023. 6. 25.

트랜잭션이란?

쪼갤 수 없는 업무의 단위로 한번에 성공하거나, 한번에 실패하는 것을 의미

 

쇼핑몰 사이트에서 물건을 주문하면?

 

1) 주문기록 저장하고

2) 포인트를 저장하고

3) 결제 기록을 저장해야 한다!

이렇게 결제기록에서 에러나서 결제기록 저장만 안되었다면?

주문 기록과 포인트는 있는데 결제 기록이 없다!!

 

 

트랜잭션 명령어

트랜잭션 시작하기

start transaction;

 

트랜잭션 정상종료(SQL 반영)

commit;

 

트랜잭션 실패 처리(SQL미반영)

rollback;

트랜잭션 내에서 수행된 SQl들은 다른 단말기에서는 그 SQL의 결과물이 보이지 않게됩니다.

commit을 하고나면 비로소 결과가 보입니다.

 

 

 

 

트랜잭션 적용과 영속성 컨텍스트

주문, 포인트, 결제 이 세개의 저장이 한몸처럼 움직여야 합니다!

모두다 성공시키거나 모두 다 실패시켜야 한다는 것입니다.

 

따라서

1. 서비스 메소드가 시작할 때 트랜잭션이 시작되어

2-1. 서비스 메소드 로직이 모두 정상적으로 성고하면 commit되고

202. 서비스 메소드 로직 실행 도중 문제가 생기면 roolback 

되게 해야 합니다

 

 

@Transactional  (org.~~)

스프링에서 트랜잭션 적용시키는 방법

 

readOnly를 쓰면 데이터 변경을 위한 불필요한 부분 빠지기 때문에 성능이 약간 향상됩니다.

 

 

RollBack되는 예시

    @Transactional
    public void saveUser(UserCreateRequest request){
       User u = userRepository.save(new User(request.getName(), request.getAge()));
       throw new IllegalArgumentException();
        //트랜잭션 적용되어있다면 저장은 성공하는데 예외가 났으니까 저장 자체가 rollback돼서 반영이 안될것
    }

 

주의사항 : 이 때 IOException과 같은 Checked Exception은 롤백이 일어나지 않습니다.

 

 

영속성 컨텍스트

테이블과 매핑된 Entity 객체를 관리/보관하는 역할입니다.

스프링에서는 트랜잭셔을 사용하면 영속성 컨텍스트가 생겨나고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료됩니다.

 

영속성 컨텍스트의 특수 능력 4가지

1. 변경 감지(Dirty Check)

영속성 컨텍스트 안에서 불러와진 Entity는 명시적으로 save하지 않더라도, 변경을 감지해 자동으로 저장된다.

트랜잭션 적용하면 사실 save하지 않더라도 알아서 업데이트함!

 

2.  쓰기 지연

DB의 INSERT/UPDATE/DELETE SQL을 바로 날리는 것이 아니라, 트랜잭션이 commit 될 때 모아서 한번만 날린다.

원래는 위처럼 3번 저장되는데, 영속성 컨텍스트로 인해 한번에 저장될 수 있음.

 

3. 1차 캐싱

ID를 기준으로 Entity를 기억한다!

 

첫번째 코드 실행 -> DB에 아이디가 1인 유저 찾아서 조회

이걸 영속성 컨텍스트가 기억하고있습니다.

두번째 코드 실행 -> id가 1인 유저 기억하고 있다가 넘겨줍니다.

세번째 코드 실행 -> id가 1인 유저 기억하고 있다가 넘겨줍니다.

시간이 걸리게 계속 네트워크를 잡아먹지 않고, 최초 한번만 데이터를 조회하고 그걸 계쏙 사용할 수 있다는 장점!

 

-> 이렇게 캐시된 객체는 완전히 동일해집니다

자바의 주소까지 완전히 동일합니다!

 

 

 

 

'java' 카테고리의 다른 글

[JAVA] JPA 대충정리  (0) 2023.06.25
[java] 익명클래스  (0) 2023.06.14
[JAVA] 빌드(build)  (0) 2023.05.26
[개념]JDK, JRE, JVM  (0) 2023.05.26
"/" (슬래시)의 의미 = 생략  (0) 2023.03.26

댓글