https://www.youtube.com/watch?v=urpF7jwVNWs
- 만약 1.3 insert가 실패한다면 개발자가 app에서 update를 어떻게든 취소하는 코드를 구현해야함
- 하지만 트랜잭션으로 묶어서 수행하면 다 같이 롤백됨
- 트랜잭션 덕분에 개발자는 어플리케이션 개발할 때 데이터 수정에 대한 문제를 상당 부분 해결해줌
- 수행 과정 살펴보기
- app1이 커넥션1을 생성(1), 트랜잭션을 시작해(2) SQL을 실행했다(3)
- 그리고 method를 호출해 svc 라는 객체에서 새로운 커넥션2를 생성하고(4.1), 트랜잭션을 시작 후(4.2), commit까지 했다(4.4)
- 이후 app1이 rollback(6)을 수행했다.
- 결과적으로 커넥션2에서 수행한 SQL은(4.3) Rollback 되지 않는다. 트랜잭션은 커넥션 기준이기 때문이다. 롤백을 한 건 커넥션1이기 때문에 커넥션2에서 수행한 SQL은 롤백 되지 않는 것이다.
- 여러 메서드를 실행해 쿼리를 실행한 뒤, 한 꺼번에 커밋/롤백을 하고싶다면, 하나의 커넥션 안에서 트랜잭션을 시작/종료하도록 개발해야함을 시사한다. → 트랜잭션 전파
- 트랜잭션 전파는 보통 직접 구현하지 않고 프레임워크가 제공한다
- Spring에서는 @Transactional 어노테이션이 그 역할을 한다.
- @Transactional 어노테이션을 붙인 메서드를 실행하면 그 메서드가 호출한 또 다른 메서드가 모두 하나의 트랜잭션에서 실행된다.
- 위의 예시에서 checkDuplicate, insert 메서드는 create 메서드가 실행될 때 생성된 트랜잭션을 공유해서 쿼리를 실행하게 된다.
- 왼쪽 그림
- update(2), insert(3)가 성공 후 외부 API를 호출하는데 실패(4)했다.
- 그리고 롤백(5)을 했을 때 update, insert가 모두 롤백되고, callApi 역시 실패했으므로 모든 실행이 일어나기 전과 동일하다.
- 오른쪽 그림
- update(2)가 성공 후 외부 API를 호출하는데 성공(3)했다.
- 그리고 insert(4)가 실패해서 롤백(5)을 하게되는데, 이럴 경우 update는 롤백이 되지만 callApi 호출은 롤백이 되지 않는다
- 이로 인한 callApi() 결과를 되돌릴 필요가 있다면 개발자가 직접 처리를 해줘야만 한다
- 이렇듯 외부 연동이 섞여있을 경우 롤백 처리에 주의해야 한다.
- 한번 읽어 보기. 거의 사용하지 않음
- all or nothing : 모두다 반영하거나(커밋), 모두다 되돌리거나(롤백)
- 문제가 발생했을 때 롤백해주는 범위는 실무에서 매우 중요하다.
'Back-End > MySQL' 카테고리의 다른 글
[MySQL] 설치 및 시작(MacOS 환경, DBeaver) (0) | 2021.07.13 |
---|