여러 읽기와 쓰기 쿼리를 논리적
으로 하나로 묶는 것
트랜잭션이 커밋되면 묶인 모든 쿼리가 DB에 반영되고, 롤백되면 모두 반영되지 않는다.
트랜잭션은 어플리케이션 레벨에서 데이터일관성을 보장하기 위한 고민을 아주 많이 없애준다. 중간에 에러가 발생하더라도 트랜잭션
단위로 오류처리해주면 된다.
트랜잭션 범위는 **커넥션**
기준이다. 따라서 여러 메서드를 하나의 트랜잭션으로 묶고 싶다면, 해당 메서드들이 사용하는 커넥션이 동일하도록 강제해야 한다. 이를 트랜잭션 전파라 한다.
스프링에선 @Transactional으로 트랜잭션 전파를 메서드간 커넥션 객체 전달 없이 구현한다.
Nest.js with Typeorm 에서는 다음의 3가지 방법으로 트랜잭션 구현이 가능하다.
레퍼런스
트랜잭션 과정에 외부 API 연동이 섞여 있으면 롤백 처리에 주의해야한다.
외부 API부분의 롤백은 개발자가 주의해서 수동으로 구현해줘야 한다.
2PC (two-phase-commit)
두 개 이상 자원을 한 트랜잭션으로 처리하는 것
하지만 성능저하나 아키텍쳐상 불가능한 이슈로 거의 사용하지 않는다. 대신 이벤트나 비동기 메시징으로 다중 자원에 대한 데이터처리를 수행함.
트랜잭션을 다룰 때 트랜잭션의 범위
를 고려하는 것이 매우 중요하다.
다음에는 트랜잭션의 격리와 동시성에 대해서 다룬다.
sample mocking comment for api test