포스트

데이터베이스 트랜잭션을 어떻게 봐야 하는가

트랜잭션이란

트랜잭션은 여러 작업을 하나의 논리적 단위로 묶어서, 전부 성공하거나 전부 실패하도록 다루는 메커니즘이다.

실무에서 트랜잭션은 단순히 BEGIN, COMMIT 문법이 아니라 “어디까지를 하나의 일관된 작업으로 볼 것인가”를 정하는 설계 도구다.

왜 필요한가

  • 중간 실패 시 데이터가 반쯤 반영되면 안 된다.
  • 동시에 여러 요청이 들어올 때 정합성을 지켜야 한다.
  • 장애 후에도 커밋된 결과는 남아 있어야 한다.

즉, 트랜잭션은 정합성, 동시성, 복구 문제를 함께 다루는 개념이다.

기본 흐름

  • 시작
  • 읽기/쓰기 수행
  • 필요 시 락 획득
  • 성공 시 commit
  • 실패 시 rollback

이 단순한 흐름 뒤에 실제로는 MVCC, undo log, redo log, lock manager 같은 메커니즘이 붙어 있다.

autocommit을 주의해야 한다

MySQL 기본 설정처럼 autocommit이 켜져 있으면 SQL 한 문장마다 자동 커밋된다. 그래서 애플리케이션에서 “여러 문장이 하나의 작업”이라면 명시적 트랜잭션 경계를 반드시 잡아야 한다.

트랜잭션에서 자주 발생하는 문제

  • lost update
  • non-repeatable read
  • phantom read
  • deadlock

이 문제들은 결국 격리 수준과 락 전략 선택으로 이어진다.

좋은 트랜잭션의 조건

  • 짧다
  • 외부 API 호출을 포함하지 않는다
  • 필요한 자원만 잠근다
  • 경계가 명확하다

특히 트랜잭션 안에서 네트워크 호출을 오래 잡고 있으면 락 대기와 데드락 가능성이 크게 올라간다.

실무 체크포인트

  • 이 작업이 정말 하나의 트랜잭션이어야 하는가
  • 실패 시 어디까지 롤백해야 하는가
  • 어떤 읽기/쓰기 경쟁이 존재하는가
  • 락이 걸리는 범위를 예측할 수 있는가

정리

트랜잭션은 DB 기능이면서 동시에 애플리케이션 경계 설계다. 중요한 것은 SQL 문법보다 “어디까지를 함께 성공해야 하는 작업으로 볼 것인가”를 정확히 정하는 것이다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

댓글

아직 댓글이 없습니다