[Database] 트랜잭션(Transaction) 완벽 가이드: ACID부터 연산 과정까지

 


1. 트랜잭션이란?

트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 하나의 논리적 작업 단위를 말한다.

즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않도록 한다.

사용자의 입장에서는 작업의 논리적 단위로 이해를 할 수 있고 시스템에의 입장에서는 데이터들은 접근 또는 변경하는 프로그램 단위가 된다. 

2. 트랜잭션의 4대 특성: ACID

♦️ Atomicity (원자성)

만약 트랜잭션 중간에 어떠한 문제가 발생한다면 트랜잭션에 해당하는 어떠한 작업 내용도 수행되어서는 안되며 아무런 문제가 발생되지 않았을 경우에만 모든 작업이 수행되어야 한다. ⇒ 트랜잭션에 포함된 작업은 전부 수행되거나 전부 수행되지 않아야 한다.

♦️ Consistency(일관성)

트랜잭션이 완료된 다음의 상태에서도 트랜잭션이 일어나기 전의 상황과 동일하게 데이터의 일관성을 보장해야 한다. ⇒ 트랜잭션을 수행하기 전이나 후나 데이터베이스는 항상 일관된 상태를 유지해야 한다.

♦️ Isolation (고립성)

각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야 한다. ⇒ 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경중인 데이터 값을 훼손하지 않아야 한다.

♦️ Durability (지속성)

트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다.⇒ 수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야 한다. 

3. 트랜잭션의 생명주기: 5가지 상태 (State)


  • Active : 트랜잭션의 활동 상태. 트랜잭션이 실행중이며 동작중인 상태를 말한다.
  • Failed :트랜잭션 실패 상태. 트랜잭션이 더이상 정상적으로 진행 할 수 없는 상태를 말한다.
  • Partially Committed :트랜잭션의 Commit 명령이 도착한 상태. 트랜잭션의 commit이전 sql문이 수행되고 commit만 남은 상태를 말한다.
  • Committed : 트랜잭션 완료 상태. 트랜잭션이 정상적으로 완료된 상태를 말한다.
  • Aborted : 트랜잭션이 취소 상태. 트랜잭션이 취소되고 트랜잭션 실행 이전 데이터로 돌아간 상태를 말한다.

💡 Partially Committed와 Commited 차이

Partial committed는 Commit 요청이 들어왔을 때를 말하며, Commited는 Commit을 정상적으로 완료한 상태를 말한다.

4. 트랜잭션 제어 연산 (TCL)

트랜잭션의 연산으로는 크게 Commit과 Rollback 두 가지가 있다.

♦️ Commit 연산

Commit 연산은 하나의 트랜잭션이 성공적으로 종료된 후, 데이터베이스가 일관된 상태를 유지할 때 갱신 연산이 완료되었다고 트랜잭션 관리자에게 알려주고 결과를 최종적으로 데이터베이스에 반영하는 연산이다.

♦️ Rollback 연산

Rollback 연산은 하나의 트랜잭션이 비정상적으로 종료되어 데이터베이스의 일관성을 잃었을 때 트랜잭션이 지금까지 실행한 연산의 결과가 취소되고 트랜잭션 수행 이전의 상태로 돌아가는 연산이다.

Rollback을 하는 경우엔 해당 트랜잭션을 재시작하거나 폐기한다.


5. 실무에서 트랜잭션을 사용할 때 주의할 점

트랜잭션의 범위를 최소화하여야 한다. 그 이유는 아래와 같다.
  1. 일반적으로 데이터베이스 커넥션은 개수가 제한적이다.
  2. 각 단위 프로그램이 커낵션을 소유하는 시간이 길어지면 사용 가능한 여유 커넥션 수가 줄어들게 된다.
  3. 그러다 어느 순간 커넥션을 가져가기 위해 단위 프로그램들이 기다려야 하는 상황이 발생한다. (DeadLock)

추가적으로 트랜잭션 내에 외부 API 호출은 제외한다. 외부 API를 트랜잭션에 포함할 시, API 응답이 늦어질 때 DB 커넥션이 계속 묶여있을 수 있다. 

댓글 쓰기

0 댓글