본문 바로가기

CS/데이터베이스

트랜잭션(Transaction)이란?

트랜잭션의 의미

트랜잭션(Transaction) 이란, 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위이다.

 

데이터베이스의 상태를 변경시킨다는 것은 SELECT, UPDATE, INSERT, DELETE 와 같은 질의어(SQL)를 통해 데이터베이스의 상태를 변경시키는 것이다. 트랜잭션은 질의어 한 문장이 아니라, 상황에 따라 개발자가 정한 여러 질의어 명령문들의 한 단위를 의미한다.

 

트랜잭션은 상황에 따라 여러 개가 만들어질 수 있고,
그 하나의 트랜잭션은 Commit (저장) 되거나 Rollback (철회)될 수 있다.

 

예시 1
사용자 A가 사용자 B에게 만원을 송금한다.
1. 사용자 A의 계좌에 만원 출금 : UPDATE로 사용자 A의 잔고 변경
2. 사용자 B의 계좌에 만원 입금 : UPDATE 로 사용자 B의 잔고 변경

출금 UPDATE + 입금 UPDATE => 하나의 트랜잭션이라고 한다.

 

예시 2
사용자는 게시글을 작성하고, 업로드 버튼을 누른다.
그리고 다시 게시판에 접속할 때, 방금 작성한 자신의 글이 포함된 게시판을 보게 된다.

사용자가 업로드 버튼을 눌렀을 때, insert 문을 사용하여 사용자가 입력한 게시글의 데이터를 옮긴다.
그 후에, 게시판을 구성할 데이터를 다시 select 하여 최신 정보로 유지한다.
여기서 insert문 + select문 => 하나의 트랜잭션이라고 한다.

 


트랜잭션의 특징 (ACID)

트랜잭션에는 4가지의 특징이 존재한다.

 

1. 원자성 (Atomicity)

  • 트랜잭션이 DB에 모두 반영되던지, 아니면 전혀 반영되지 않아야 한다. → All or Nothing
  • 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 한다.
  • 트랜잭션 내 명령 중 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.

2. 일관성 (Consistency)

  • 트랜잭션 작업 처리 결과가 항상 일관되어야 한다
  • 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전후의 상태가 같아야 한다.

3. 독립성 (Isolation)

  • 각각의 트랜잭션은 독립적이다.
  • 하나의 트랜잭션은 다른 트랜잭션에 끼어들 수 없다.
  • 수행 중인 트랜잭션은 완전히 완료될 때까지 해당 트랜잭션의 수행 결과를 다른 트랜잭션에서 참조할 수 없다.

4. 지속성 (Durability)

  • 트랜잭션이 성공적으로 완료되면 영구적으로 결과에 반영되어야 한다.

 


트랜잭션의 연산

Commit

하나의 트랜잭션이 성공적으로 끝났으며, 데이터베이스가 일관성 있는 상태에 있다는 것을 의미한다. 

Rollback

하나의 트랜잭션 처리가 비정상적으로 종료되었을 때의 상태이다.

 


트랜잭션의 상태 

트랜잭션에 5가지의 상태가 있다.

 

  • 활동(Active) : 트랜잭션의 활동 상태. 트랜잭션이 현재 실행 중인 상태이다.
  • 부분완료(Partially Committed) : 트랜잭션의 연산이 끝까지 실행되어 Commit이 되기 직전 상태이다.
  • 완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태. 정상적으로 완료된 상태이다.
  • 실패(Failed) : 트랜잭이 실행되다 오류로 중단된 상태. 트랜잭션이 더 이상 정상적으로 진행될 수 없는 상태이다.
  • 취소(Aborted) : 트랜잭션이 비정상 종료되어 Rollback 이 수행된 상태. 트랜잭션이 취소되고 트랜잭션 실행 이전 데이터로 돌아간 상태이다.

트랜잭션을 사용할 때 주의할 점

트랜잭션은 꼭 필요한 최소의 코드에만 적용해야 한다. => 트랜잭션의 범위를 최소화

일반적으로 데이터베이스 커넥션은 개수는 제한적이므로 

각 단위 프로그램의 커넥션 소유 시간이 길어지면 사용 가능한 여유 커넥션의 개수는 줄어든다.

각 단위 프로그램에서 커넥션을 얻기 위해 기다려야 하는 상황이 발생할 수 있다.