학습자료
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
- 트랜잭션의 범위를 잘 고려하자 (문제가 발생했을 때 롤백해야 하는 범위)
다
- 다음 주제는 트랜잭션 격리/동시성