본문 바로가기
CS/DataBase

데이터베이스 첫걸음 정리 - 36장. 트랜잭션

by yongckim 2022. 10. 9.
728x90
반응형

트랜잭션

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

쉽게 말해서, SQL 명령들을 하나로 묶어 실행할 수 있는 기능입니다.

트랜잭션 설명을 위해 다음과 같은 테이블이 있다고 가정해봅시다.

위의 주문 테이블과 주문 상품 테이블 사이에는 의존관계가 존재합니다.

즉, 상품을 주문하게 되면 주문 테이블에 주문 정보가 들어가고 주문상품에는 해당 주문에 대한 상품 목록이 들어가게 됩니다.

이제 주문이 발생하는 상황을 생각해봅시다.

먼저, 주문 정보에 대한 행을 추가하고 주문한 상품에 대한 행들이 추가될 것입니다.

INSERT INTO 주문 VALUES(4, '2014-03-01', 1);
INSERT INTO 주문상품 VALUES(4, '0001', 1);
INSERT INTO 주문상품 VALUES(4, '0002', 1);

만약 INSERT 명령을 통해 값을 추가하는 과정에서 어떤 원인 때문에 에러가 발생했다고 가정해봅시다.

이때, 트랜잭션 기능을 사용하지 않는 경우 실행 전으로 되돌릴 수 없으므로 따로 DELETE 명령을 실행해 지워야 합니다.

이런 경우 하나하나 지우는 과정이 굉장히 번거롭고 실수로 데이터를 삭제하지 않을 경우 잘못된 데이터가 저장된 상태로 데이터베이스가 유지될 수 있습니다.

롤백과 커밋

이처럼 몇 단계로 처리를 나누어 SQL 명령을 실행하는 경우 트랜잭션을 자주 사용하게 됩니다.

트랜잭션을 사용해서 데이터를 추가한다면 에러가 발생해도 트랜잭션을 롤백해서 종료할 수 있습니다.

롤백명령을 입력하기 이전으로 되돌리기 때문에 트랜잭션 내에서 행해진 모든 변경사항을 없었던 것으로 할 수 있습니다.

아무런 에러가 발생하지 않는다면 변경사항을 적용하고 트랜잭션을 종료하는데 이때, 커밋을 사용합니다.

자동커밋과 트랜잭션 시작

자동커밋은 데이터베이스 클라이언트 도구의 기능으로 SQL 명령을 입력 직후 바로 적용하도록 해줍니다.

데이터베이스 서버의 경우 언제나 트랜잭션을 걸 수 있는 상태로 SQL 명령이 실행됩니다.

 

트랜잭션을 사용해서 데이터를 추가할 때는 자동커밋을 꺼야합니다.

mysql의 경우 INSERT, UPDATE, DELETE가 처리될 때마다 자동커밋이 켜져있으므로 해당 명령의 결과가 바로 적용됩니다.

자동커밋을 끄기 위해서는 명시적으로 트랜잭션의 시작을 선언할 필요가 있습니다.

트랜잭션을 시작할 때는 START TRANSACTION 명령을 사용합니다. (MySQL)

START TRANSACTION

앞서 언급한 것처럼 트랜잭션을 종료하기 위해서는 변경된 내용을 적용한 후에 종료하는 커밋적용하지 않고 종료하는 롤백의 두 가지 방식이 있습니다.

커밋을 할때는 COMMIT 명령을 사용합니다.

COMMIT

롤백은 ROLLBACK 명령을 사용합니다.

ROLLBACK

트랜잭션 내에서 실행된 SQL 명령은 임시 데이터 영역에서 수행되다가 COMMIT 명령을 내리면 임시 데이터 영역에서 정식 데이터 영역으로 변경이 적용된다고 생각하면 됩니다.

ROLLBACK 명령을 내리면 임시 데이터 영역에서의 처리는 버려집니다.

예시로 INSERT가 정상적으로 완료된 후 적용을 하고 싶은 경우 다음과 같이 작성할 수 있습니다.

START TRANSACTION
INSERT INTO 주문 VALUES(4, '2014-03-01', 1);
INSERT INTO 주문상품 VALUES(4, '0001', 1);
INSERT INTO 주문상품 VALUES(4, '0002', 1);
COMMIT;

이렇게 트랜잭션을 시작해서 SQL 명령을 실행하고 COMMIT 또는 ROLLBACK 명령으로 트랜잭션을 종료하는 일련의 처리방법을 “트랜잭션을 걸어서 실행한다” 또는 “트랜잭션 내에서 실행한다”라고 말합니다.

트랜잭션 사용법

트랜잭션을 사용하면 트랜잭션 내에서 여러개의 SQL 명령을 실행할 수 있지만 하나의 명령도 실행 가능합니다.

다만, 이런 경우 트랜잭션을 사용할 이유가 없습니다.

트랜잭션을 걸면 여러개의 SQL 명령은 명령 단위로 유효/무효가 되기 때문에 한 세트로 실행시키고 싶은 SQL 명령을 트랜잭션에서 하나로 묶어 실행하는 것이 좋습니다.

정리

  • 트랜잭션은 데이터베이스 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 일련의 연산들을 의미합니다.
  • 트랜잭션을 시작하기 위해서 START TRANSACTION(MySQL 기준)을 사용합니다.
  • 트랜잭션을 사용하면 롤백과 커밋을 사용할 수 있으며 각각 다음의 역할을 수행합니다.
    • 커밋은 변경된 내용을 적용한 후에 종료합니다. (COMMIT 명령 사용)
    • 롤백은 변경된 내용을 적용하지 않고 종료합니다.
  • 자동커밋은 데이터베이스 클라이언트 도구의 기능으로 SQL 명령을 입력 직후 바로 적용하도록 해줍니다.
  • 트랜잭션 내에서 실행된 SQL 명령은 임시 데이터 영역에서 수행되다가 COMMIT 명령을 내리면 임시 데이터 영역에서 정식 데이터 영역으로 변경이 적용되고 ROLLBACK 명령을 내리면 임시 데이터 영역에서의 처리는 버려집니다.
  • 트랜잭션을 걸면 여러개의 SQL 명령은 명령 단위로 유효/무효가 되기 때문에 한 세트로 실행시키고 싶은 SQL 명령을 트랜잭션에서 하나로 묶어 실행하는 것이 좋습니다.
반응형