[DB] 트랜잭션(Transaction)

박재희·2023년 12월 28일

트랜잭션 (Transaction)

트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 수행되어야할 일련의 연산들을 의미한다.

데이터 베이스의 상태를 변화시킨다는 말은 SELECT, INSERT, UPDATE, DELETE 등과 같은 조작어를 사용하는 행동을 의미한다 (단, SQL 한 문장만이 작업 단위는 아니며 DDL문(CREATE, DROP, ALTER, RENAME, TRUNCATE)은 transaction의 rollback 대상이 아니다)

트랙잭션 사용 이유

  1. A 은행에서 출금하여 B은행으로 송금하려고 한다.
  2. 송금 중, 알 수 없는 오류가 발생하여 A은행 계좌에서 돈은 빠져나갔지만 B은행의 계좌에 입금되지 않았다

계좌이체 라는 행위는 인출과 입금 두 과정으로 이루어진다

위와 같이 만약 인출에는 성공했는데, 입금에 실패하면 치명적인 결과가 나오기 때문에 이러한 모든 작업은 모두 정상적으로 완료되거나, 혹은 하나의 작업이라도 정상적으로 처리될 수 없는 경우에는 아무 것도 실행되지 않은 처음 상태로 되돌려져야 한다

이와 같이, 데이터베이스와 어플리케이션의 데이터 거래(Transaction)에 있어서 안전성을 확보하기 위한 방법 이 트랜잭션이다 데이터베이스에서는 테이블로부터 데이터를 읽어 온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는데 처리 도중 오류가 발생하면 Rollback 되고, 모든 처리 과정이 성공적으로 수행되었을 경우에 최종적으로 Commit 된다

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


트랜잭션의 Commit과 Rollback

  • 커밋(Commit)

Commit이란, 모든 작업들을 정상 처리하겠다고 확정하는 명령어로서, 해당 처리 과정을 DB에 영구 저장하겠다는 의미이며, Commit을 수행하면 하나의 트랜잭션 과정이 종료되는 것이다. Commit을 수행하면 이전 데이터가 완전히 반영되어 UPDATE된다

  • 롤백(Rollback)

Rollback 연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산이다

  • 세이브 포인트(Save Point)

일반적으로 ROLLBACK을 명시하면 INSERT, DELETE, UPDAT 등의 작업 전체가 취소되는데 전체가 아닌 특정 부분에서 트랜잭션을 취소시킬 수 있다
SAVEPOINT를 지정한뒤 ROLLBACK TO SAVEPOINT이름;을 실행하면 지정한 해당 SAVEPOINT 지점까지 처리한 작업이 취소(ROLLBACK)된다.

예를 들어, 주문 처리 시 주문 정보를 업데이트하고 결제를 시도하는 트랜잭션이 있다 주문 정보 업데이트는 성공했지만 결제가 실패한 경우 해당 지점에서 롤백하여 주문 정보를 이전 상태로 되돌릴 수 있다. 이후 다시 결제를 시도할 수 있다

  • 기본형태
	SAVEPOINT 세이브포인트이름;
  • ROLLBACK 형태
	ROLLBACK TO 세이브포인트이름;

트랜잭션 특징(ACID)

  • Atomicity(원자성)

    • 트랜잭션이 데이터베이스에 모두 반영되던지, 아니면 전혀 반영 되지 않아야 한다.
    • 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느 하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다
  • Consistency(일관성)

    • 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다
    • 트랜잭션이 진행되는 동안에 데이터베이스가 변경 되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는것이 아니라, 처음에 트랜잭션을 진행 하기 위해 참조한 데이터베이스로 진행된다
  • Isolation(독립성)

    • 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도 다른 트랜잭션의 연산에 끼어들수 없다
    • 수행 중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조 할 수 없다
  • Durability(영구성)

    • 트랜잭션이 성공적으로 완료되었을 경우, 결과는 영구적으로 반영되어야 한다

트랜잭션 상태

트랜잭션의 개념은 서술한 바와 같이 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 혹은 데이터베이스 시스템에서 복구 및 병행 수행시 처리되는 작업의 논리적 단위이다

  • 활성(Active) : 트랜잭션이 정상적으로 실행중인 상태를 의미한다 트랜잭션이 시작되면, 해당 트랜잭션의 상태는 활동(Active)상태가 된다 해당 상태는 설계자가 설계한 대로 연산들이 정상적으로 실행중인 상태를 의미한다.

- 작업 성공시,

  • 부분 완료(Partially Committed) : 트랜잭션의 마지막까지 실행되었지만, Commit 연산이 실행되기 직전의 상태
  • 완료(Committed) : 트랜잭션이 성공이 종료되어 Commit 연산을 실행한 후의 상태설계된 트랜잭션대로 명령을 성공적으로 수행하면 그 다음 상태는 부분적 완료(Partially Committed)상태가 된다.

설계된 작업대로 작업이 성공하였다고 하여 무조건 반영하는 것이 아니라, 설계자의 최종 승인(Commit)이 있을 때 까지 실제 데이터베이스에 작업 내용을 반영하지 않고 기다리고 있는 상태이다.설계자가 작업 결과에 대하여 반영을 승인(Commit)한다면 트랜잭션이 성공적으로 종료된다(Committed)

- 작업 실패시,

  • 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
  • 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태

트랜잭션을 수행하는 중간에 모종의 원인으로 인하여 오류가 발생하여 실행이 중단된 상태를 실패(Failed)상태라고 한다
이때 트랜잭션이 비정상적으로 종료되었으니, 설계되어있는 트랜잭션 내부의 작업을 다시 수행 이전의 상태로 돌리는 (ROLLBACK) 연산을 수행하면 그 상태를 철회(Aborted)라고 한다


  • transation을 어떻게 정의해서 쓸지는 개발자가 정의하는 것이다
    구현하려는 기능과 ACID 속성을 이해해야 transation을 잘 정의할 수 있다
  • 트랜잭션 기능은 MySQL의 엔진에 영향을 받는다 DB 엔진을 InnoDB로 하셔야 트랜잭션을 사용할 수 있다 * 다른 스토리지 엔진(MyISAM 등)을 선택할 경우 트랜잭션의 ACID 특성을 완전히 지원하지 않거나 일부 제한이 있을 수 있다)
  • 트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다. 즉 트랜잭션의 범위를 최소화하라는 의미다.
    일반적으로 데이터베이스 커넥션은 개수가 제한적이다
    그런데 각 단위 프로그램이 커넥션을 소유하는 시간이 길어진다면 사용 가능한 여유 커넥션의 개수는 줄어들게 된다
    그러다 어느 순간에는 각 단위 프로그램에서 커넥션을 가져가기 위해 기다려야 하는 상황이 발생할 수도 있는 것이다

📚 참고 자료
https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98Transaction-%EC%9D%B4%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC#%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98_%EC%83%81%ED%83%9C
https://jerryjerryjerry.tistory.com/48
https://devuna.tistory.com/30

0개의 댓글