프로그래밍 초식 : DB 트랜잭션 조금 이해하기 01

Donghun Seol·2023년 4월 28일
0

프로그래밍 초식

목록 보기
9/13

레퍼런스

트랜잭션

여러 읽기와 쓰기 쿼리를 논리적으로 하나로 묶는 것
트랜잭션이 커밋되면 묶인 모든 쿼리가 DB에 반영되고, 롤백되면 모두 반영되지 않는다.
트랜잭션은 어플리케이션 레벨에서 데이터일관성을 보장하기 위한 고민을 아주 많이 없애준다. 중간에 에러가 발생하더라도 트랜잭션 단위로 오류처리해주면 된다.

트랜잭션 전파

트랜잭션 범위는 **커넥션** 기준이다. 따라서 여러 메서드를 하나의 트랜잭션으로 묶고 싶다면, 해당 메서드들이 사용하는 커넥션이 동일하도록 강제해야 한다. 이를 트랜잭션 전파라 한다.
스프링에선 @Transactional으로 트랜잭션 전파를 메서드간 커넥션 객체 전달 없이 구현한다.
Nest.js with Typeorm 에서는 다음의 3가지 방법으로 트랜잭션 구현이 가능하다.
레퍼런스

  1. query runner를 사용해서 단일 커넥션 상태를 생성하고 관리
    • 커넥션객체를 주입받아서 사용한다.
  2. transaction 객체를 활용
    • repository를 사용하지 않고 entity manager를 활용해서 DB를 조작한다.
  3. @Transaction 데커레이터 사용
    • nest.js 공식문서에서 추천하지 않는 방법

트랜잭션과 외부 연동

트랜잭션 과정에 외부 API 연동이 섞여 있으면 롤백 처리에 주의해야한다.
외부 API부분의 롤백은 개발자가 주의해서 수동으로 구현해줘야 한다.

글로벌 트랜잭션

2PC (two-phase-commit)
두 개 이상 자원을 한 트랜잭션으로 처리하는 것

  • DB와 MQ 등을 트랜잭션으로 처리
  • 글로벌 트랜잭션 관리자가 필요

하지만 성능저하나 아키텍쳐상 불가능한 이슈로 거의 사용하지 않는다. 대신 이벤트나 비동기 메시징으로 다중 자원에 대한 데이터처리를 수행함.

위에서 소개한 내용은 모두 원자성(Atomicity)을 보장하기 위한 기능!

트랜잭션을 다룰 때 트랜잭션의 범위를 고려하는 것이 매우 중요하다.

다음에는 트랜잭션의 격리와 동시성에 대해서 다룬다.

profile
I'm going from failure to failure without losing enthusiasm

3개의 댓글

comment-user-thumbnail
2023년 5월 12일

sample mocking comment for api test

답글 달기
comment-user-thumbnail
2023년 5월 13일

sample mocking comment for api test

답글 달기
comment-user-thumbnail
2023년 5월 13일

sample mocking comment for api test

답글 달기