트랜잭션 commit, rollback

2023. 7. 24. 14:58·Spring
728x90

 

 

@Slf4j
@SpringBootTest
public class BasicTxTest {

    @Autowired
    PlatformTransactionManager txManager;

    @TestConfiguration
    static class Config{
        @Bean
        public PlatformTransactionManager transactionManager(DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    }

    @Test
    void commit(){
        log.info("트랜잭션 시작");
        TransactionStatus status = txManager.getTransaction(new DefaultTransactionAttribute());

        log.info("트랜잭션 커밋 시작");
        txManager.commit(status);
        log.info("트랜잭션 커밋 완료");
    }

    @Test
    void rollback(){
        log.info("트랜잭션 시작");
        TransactionStatus status = txManager.getTransaction(new DefaultTransactionAttribute());

        log.info("트랜잭션 롤백 시작");
        txManager.rollback(status);
        log.info("트랜잭션 롤백 완료");
    }

    @Test
    void double_commit(){
        log.info("트랜잭션1 시작");
        TransactionStatus tx1 = txManager.getTransaction(new DefaultTransactionAttribute());
        log.info("트랜잭션1 커밋");
        txManager.commit(tx1);

        log.info("트랜잭션2 시작");
        TransactionStatus tx2 = txManager.getTransaction(new DefaultTransactionAttribute());
        log.info("트랜잭션2 커밋");
        txManager.commit(tx2);
    }
}

 

 

 

 

 

📌 트랜잭션

  • ‘트랜잭션’이란 '거래'라는 뜻으로 데이터베이스 내에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 논리적인 작업 단위이다.
  • 여러 단계의 처리를 하나의 처리처럼 다루는 기능
    • 여러 개의 명령어의 집합이 정상적으로 처리되면 정상 종료된다.
    • 하나의 명령어라도 잘못되면 전체 취소된다.
      • 트랜잭션을 쓰는 이유는 데이터의 일관성을 유지하면서 안정적으로 데이터를 복구하기 위함

 

참고

  • POSTGRESQL 은 DDL(data definition language : 데이터 조작어)도 커밋을 해야한다!
  • 오라클은 DDL은 커밋을 할 필요가 없다.

 

 

📌 트랜잭션 필요성

(출처 : https://jerryjerryjerry.tistory.com/48)

1. 트랜잭션은 '거래'라는 뜻으로, 은행에서 입금과 출금을 하는 그 거래를 뜻한다.
2. A 은행에서 출금하여 B은행으로 송금한다고 가정하자.
3. 송금하는 중에 알 수 없는 오류가 발생하여 A은행 계좌에서 돈이 빠져 나갔는데 B은행 계좌에 입금되지 않았다.
4. 이때, 우리는 A은행 계좌의 출금을 취소하거나, 출금된 금액만큼 B은행 계좌로 다시 송금하면 된다.
5. 하지만 이 방법은 번거롭고 더 심한 오류를 발생시킬수 있다.
6. 그래서 생각해낸 해결책이, 거래가 성공적으로 모두 끝난 후에야 이를 완전한 거래로 승인하고, 거래 도중 뭔가 오류가 발생했을 때는 이 거래를 아예 처음부터 없었던 거래로 되돌리는 것이다.
7. 이렇게 거래의 안전성을 확보하는 방법이 트랜잭션이다.
8. Database에선 테이블에서 데이터를 읽어 온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는데 처리 도중 오류가 발생하면 모든 작업을 원상태로 되돌린다.
9. 데이터베이스에선 처리 과정이 모두 성공했을 때만 최종적으로 데이터베이스에 반영한다.

📌 트랜잭션의 종류

  • 트랜잭션에는 내가 적은 쿼리문과 데이터를 최종적으로 데이터베이스에 반영하는 COMMIT과 실패했을때 COMMINT 시점으로 다시 되돌아가는 ROLLBACK이 있다.
    1. 활동 : 트랜잭션이 실행 중에 있는 상태, 연산들이 정상적으로 실행 중인 상태
    2. 실패 : 트랜잭션이 실행에 오류가 발생하여 중단된 상태
    3. 철회 : 트랜잭션이 비정상적으로 종료되어 ROLLBACK 연산을 수행한 상태
    4. 부분적 완료 : COMMIT 연산이 실행되기 직전의 상태로 아직 작성한 것들을 저장하지 않은 상태
    5. 완료 : 트랜잭션이 성공적으로 종료되어 COMMIT 연산을 실행한 후의 상태

 

 

COMMIT

  • 완전 저장
  • COMMIT이란 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어로 처리과정을 DB에 영구 저장하는 것이다.
  • COMMIT을 수행하면 하나의 트랜잭션 과정을 종료하는 것이다.
  • COMMIT을 수행하면 이전 데이터가 완전히 UPDATE 된다.
  • 위 그림에서 첫번째 COMMIT후 그 뒤에 UPDATE 문으로 데이터를 갱신하고(3), DELETE문으로 데이터를 삭제하고(4), INSERT 문을 사용해 데이터를 삽입(5)한다.
  • 만약 이 모든 과정이 오류 없이 수행되었다면 지금까지 실행한 모든 작업(3,4,5)을 데이터베이스에 영구 저장하라는 명령으로 COMMIT을 수행한다.

 

 

ROLLBACK

  • ROLLBACK은 작업 중 문제가 발생되어 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어 이다.
    - 트랜잭션이 시작되기 이전의 상태로 되돌린다.
    - 즉, 마지막 COMMIT을 완료한 시점으로 다시 돌아간다.
    - COMMIT하여 저장한 것만 복구한다.
  • 위 그림에서 ROLLBACK 명령은 마지막으로 수행한 COMMIT 명령까지만 청상처리(1,2)된 상태로 유지한다.
  • 그 이후에 수행했던 모든 DML 명령어 작업(3,4,5)들을 취소시켜 이전 상태로 원상 복귀 시킨다.
  • 트랜잭션은 이렇든 ALL-OR-Nothing 방식으로 DML 명령어들을 처리한다.
  • ALL-OR-Nothing이란 '모든것을 수행하던지 아무것도 하지말던지'라는 의미이다.
 

 

728x90

'Spring' 카테고리의 다른 글

트랜잭션 전파 (기본, 내부, 외부)  (0) 2023.07.27
Getter, Setter (심화)  (0) 2023.07.24
트랜잭션 AOP 주의 사항 - 프록시 내부 호출  (0) 2023.07.18
JPA  (0) 2023.07.12
[JUnit5] 기본 Annotation  (0) 2023.07.11
'Spring' 카테고리의 다른 글
  • 트랜잭션 전파 (기본, 내부, 외부)
  • Getter, Setter (심화)
  • 트랜잭션 AOP 주의 사항 - 프록시 내부 호출
  • JPA
minseououo
minseououo
    250x250
  • minseououo
    StudyRepository
    minseououo
  • 전체
    오늘
    어제
    • 분류 전체보기 (99)
      • 인버터 (5)
      • 자동차 (25)
      • 모터 (5)
      • 검증 (2)
      • Spring (46)
      • 프로젝트 (1)
      • 인공지능 (2)
      • 운영체제 (5)
      • Algorithm (2)
      • 소프트웨어공학 (5)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    clarke변환
    스프링
    백앤드
    SDV
    AUTOSAR
    MILS
    park변환
    ASW
    자동차
    bsw
    mtpa
    모터제어
    자바
    자동차 통신
    hils 검증
    인버터
    자율주행
    Spring
    java
    EILS
    토크 리플
    전류 제한원
    약계자제어
    자동차 신차 개발 프로세스
    ISO26262
    ASPICE
    자동차 네트워크
    코깅 토크
    dq변환
    PI제어
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
minseououo
트랜잭션 commit, rollback
상단으로

티스토리툴바