Back-End/MySQL

[DB] 트랜잭션(Transaction)

유자맛바나나 2023. 3. 29. 03:34

 

 

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

 

 

  • 만약 1.3 insert가 실패한다면 개발자가 app에서 update를 어떻게든 취소하는 코드를 구현해야함
  • 하지만 트랜잭션으로 묶어서 수행하면 다 같이 롤백됨
  • 트랜잭션 덕분에 개발자는 어플리케이션 개발할 때 데이터 수정에 대한 문제를 상당 부분 해결해줌

 

  • 수행 과정 살펴보기
    1. app1이 커넥션1을 생성(1), 트랜잭션을 시작해(2) SQL을 실행했다(3)
    2. 그리고 method를 호출해 svc 라는 객체에서 새로운 커넥션2를 생성하고(4.1), 트랜잭션을 시작 후(4.2), commit까지 했다(4.4)
    3. 이후 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