[Database] Transaction(트랜잭션) 이란?

트랜잭션 (Transaction)

데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위

 

트랜잭션이 필요한 이유

SELECT → UPDATE → INSERT 순으로 동작하는 비즈니스 로직이 있다고 가정하자.

만약 UPDATE를 성공적으로 수행한 후 INSERT를 수행하는 과정에서 오류가 발생해 성공적으로 INSERT가 수행되지 않았다면, 이는 로직을 작성한 개발자가 의도한대로 처리된 것이 아니라고 봐야 한다. 따라서 개발자는 어떻게든 수행된 UPDATE를 되돌려야 하고, 이는 복잡한 추가 작업을 요구한다.

트랜잭션을 도입하면 INSERT까지 모든 쿼리가 정상적으로 수행된 경우에만 변경 사항을 반영하고(Commit), 중간에 예외 등에 의해 일부 쿼리가 정상적으로 수행되지 못한 경우에는 수행된 쿼리의 변경 사항을 되돌려(Rollback) 데이터를 하나의 단위로 다루고 일관성을 보장할 수 있게 한다.

 

트랜잭션의 특징

트랜잭션은 다음의 요소들을 보장함으로써 안전성을 보장한다.

원자성 (Atomicity)

  • 원자성이란 더 작은 부분으로 쪼갤 수 없음을 의미
  • 하나의 작업 단위는 모두 반영되거나(Commit) 그렇지 않거나(RollBack) 둘 중 하나여야 하지 일부만 반영되어서는 안 됨

일관성 (Consistency)

  • 트랜잭션 결과는 일관적인 데이터베이스에 적용되어야 함
  • 즉, 트랜잭션 도중 데이터베이스에 변화가 일어나도 트랜잭션은 처음 시작 시 참조한 데이터베이스를 기준으로 진행

격리성 (Isolation)

  • 여러 개의 트랜잭션이 실행될 때, 하나의 트랜잭션은 서로 다른 트랜잭션에 간섭할 수 없음
  • 동일한 데이터베이스 레코드에 접근하면 동시성 문제가 발생하기 때문
  • 트랜잭션 격리와 연결

지속성 (Durability)

  • 트랜잭션의 처리 결과는 데이터베이스에 영구적으로 반영되어야 함
  • HW 결함, DB 서버 다운 등에도 데이터가 보존되어야 함을 의미 (비휘발성으로 저장)

중요한 요소는 원자성과 격리성이다. 트랜잭션은 문제가 발생했을 때 롤백할 범위를 지정하기 위해 다수의 쿼리를 하나의 단위로 묶는 기능이라는 것(원자성), 트랜잭션 간의 작업 공간을 침범하게 되면 의도하지 않은 변수가 발생할 수 있기 때문에 트랜잭션을 격리해야 한다는 것(격리성)에 집중해야 한다.

 

Commit과 Rollback

Commit

  • 하나의 트랜잭션이 성공적으로 수행된 경우 이 사실을 트랜잭션의 관리 주체에게 알림
  • 이후 해당 변경 사항은 데이터베이스에 반영됨

Rollback

  • 트랜잭션의 처리에 실패한 경우 호출되는 명령
  • 원자성을 보장하기 위해 앞서 수행한 명령들을 취소시킴