220424 TIL (Transaction 기본 개념)

Minseok-Choi·2022년 4월 24일
0

TIL

목록 보기
5/11

학습자료

https://www.youtube.com/watch?v=urpF7jwVNWs

학습계기

  • 미션을 진행하면서, 다른 멤버의 코드 혹은 리뷰에서 Transaction에 대한 키워드를 알게되었다.
  • 정확한 이해가 없이 사용하고 싶지 않아서, 스프링에서 지원해주는 @Transactional 어노테이션을 사용하고 있지 않았다.
  • DB 공부를 이제 막 시작하는 과정에서 미뤄뒀던 트랜잭션에 대해서 아주 기본이자 핵심에 대한 영상이 있어서 보고, 정리하게 되었다.

트랜잭션

  • 여러 읽기/쓰기를 논리적으로 하나로 묶어주는 것
  • 트랜잭션 시작 -> 여러 쿼리 실행 -> 커밋 혹은 롤백
  • 모두 반영(커밋) 또는 모두 반영하지 않음(롤백)

트랜잭션이 없다면?

  • 문제 발생시 어플리케이션이 데이터 일관성을 보장해야함
  • 어플리케이션 개발자가 데이터에 대해서 고민해야하는 부분에 대해서 상당부분 해결해줌

트랜잭션의 범위는 커넥션 기준

출처: https://www.youtube.com/watch?v=urpF7jwVNWs

  • 트랜잭션의 범위는 커넥션 기준으로, 5.excute(sql)에서 문제가 발생해서 rollback이 되게 되는데 커넥션1에 대해서는 롤백이 되지만, 다른 커넥션인 커넥션2의 경우는 정상적으로 커밋이 되게된다.(롤백이 되지 않는다.)
  • 그래서 여러 메소드를 하나의 커넥션으로 묶을 필요가 있다.

트랜잭션 전파

  • 여러 메서드 호출이 한 트랜잭션에 묶이도록 하기 위해 필요하다.
  • 트랜잭션 전파는 프레임워크에서 지원한다. Spring의 @Transactional 어노테이션이 그 예이다.

트랜잭션과 외부 연동

  • 외부 연동이 섞여 있으면 롤백 처리에 주의해야한다.

    출처: https://www.youtube.com/watch?v=urpF7jwVNWs

  • 왼쪽 그림에서 4.callApi() 호출이 실패하게 되면, 2,3번 또한 rollback이 되게 되어서 문제가 발생하지 않는 것으로 보인다.
  • 하지만 오른쪽 그림에서 3.callApi()가 성공했지만, 4. insert가 실패하게 된다면 외부api 호출에 대해서는 rollback이 되지 않기 때문에 그에 맞게 데이터를 원복시킬 수 있도록 신경써야한다.
  • 물론 왼쪽그림 또한 외부api가 성공했지만, 네트워크에 문제가 생겨서 5.rollback이 생기는 경우도 생길수 있다.

글로벌 트랜잭션

  • 2PC (two-phase commit)
  • 두 개 이상 자원(DB, 메시징큐 등)을 한 트랜잭션으로 처리
  • 두 개 이상 자원에 대한 트랜잭션의 처리가 쉬워지지만, 거의 사용하지 않는다.
  • 성능이 떨이지고, 서비스와 마이크로서비스로 개발을 하게되면 아키텍쳐적으로 사용할 수 없다.
  • 그래서 다중자원에 대한 데이터 처리가 필요하면 다른 수단을 고려하는것이 더 현실적이다. (이벤트/비동기 메시징)

정리

  • 원자성(Atomicity) All or Nothing
  • 트랜잭션의 범위를 잘 고려하자 (문제가 발생했을 때 롤백해야 하는 범위)
  • 다음 주제는 트랜잭션 격리/동시성
profile
차곡차곡

0개의 댓글