자격증/SQLD

[SQL 첫걸음] 36강. 트랜잭션

동호다찌 2022. 4. 4. 09:33

트랜잭션

  • 데이터베이스는 트랜잭션(Transaction)이라는 기능을 제공합니다.
  • INSERT, UPDATE 명령에도 트랜잭션 기능을 사용하는 데 별도로 신경쓰지 않았던 이유는 자동 커밋(Auto Commit)이라 불리는 기능이 동작했기 때문입니다.

트랜잭션

  • 앞서 정규화에서 사용했던 테이블 주문과 주문상품의 관계를 생각해보겠습니다.

  • 이때 테이블 주문과 주문상품 사이에는 의존관계가 존재합니다.
  • 주문 테이블에 행이 존재한다면 반드시 주문상품 테이블에도 행이 존재해야 합니다.
  • 그렇지 않으면 주문한 상품이 없는데 주문이 된 상태이기 때문입니다.
  • 따라서 주문 테이블에 행을 추가할 때 주문상품 테이블에도 행이 추가되어야 합니다.

발주처리

  • 주문이 발생하면 기존 주문과 구분되는 주문번호를 발행해야 합니다.
  • 보통은 AUTO_INCREMENT와 같은 키워드를 통해 자동으로 증가하는 열을 기본키로 하여 중복되지 않게 합니다.
  • 만약 두 개의 상품을 구매하면 아래와 같이 삽입(INSERT) 명령이 실행됩니다.
> INSERT INTO 주문 VALUES(4, 3/1, 3);
> INSERT INTO 주문상품 VALUES(4, 0001, 2);
> INSERT INTO 주문상품 VALUES(4, 0002, 4);
  • 이를 통해 적어도 두 번 이상의 INSERT 명령이 실행되어야 한다는 것을 알 수 있습니다.
  • 만약 어떤 사건이 발생하여 오류가 발생한다면 해당 명령 이전에 정상적으로 실행된 INSERT 명령은 DELETE 명령을 통해 삭제해야 합니다.
  • 예를 들어 주문 테이블에 정상적으로 데이터를 삽입했더라도 주문상품 테이블에 데이터를 삽입하는 과정에서 오류가 발생하면 주문 테이블에 삽입된 데이터를 삭제해야 하는 것입니다.

롤백과 커밋

  • 위와 가팅 몇 단계로 처리를 나누어 SQL 명령을 실행하는 경우 트랜잭션을 사용합니다.
  • 오류가 발생해도 트랜잭션을 롤백(Rollback)하여 종료할 수 있고 정상적으로 모든 작업이 처리가 되면 커밋(Commit)을 통해 변경사항을 적용하고 트랜잭션을 종료합니다.

자동커밋

  • 트랜잭션을 사용해서 데이터를 추가할 때는 자동 커밋을 꺼야합니다.
  • 암묵적으로 자동커밋 상태로 되어 있기 때문에 START TRANSACTION 명령을 사용하여 명시적으로 트랜잭션의 시작을 선언해야 합니다.
  • 만약 정상적으로 작동하여 트랜잭션 내에서 실행한 명령을 적용한 후 종료하고 싶으면 COMMIT 명령을 사용합니다.
  • 그러나 오류가 발생하여 실행한 명령을 파기하고 종료하고 싶으면 ROLLBACK 명령을 사용합니다.
  • 트랜잭션 내에서 실행된 SQL 명령은 임시 데이터 영역에서 수행되다가 COMMIT 명령을 통해 정식 데이터 영역으로 변경이 적영되거나 ROLLBACK 명령을 통해 정식 데이터 영역으로 가지 않고 임시 데이터 영역에서 그대로 삭제됩니다.
  • 앞서 두 개의 상품을 구매하여 삽입(INSERT)하는 경우를 트랜잭션을 통해 구현하면 아래와 같습니다.
> START TRANSACTION;
> INSERT INTO 주문 VALUES(4, 3/1, 3);
> INSERT INTO 주문상품 VALUES(4, 0001, 2);
> INSERT INTO 주문상품 VALUES(4, 0002, 4);
> COMMIT;

이와 같이 트랜잭션을 통한 일련의 처리방법을 트랜잭션을 걸어서 실행한다 혹은 트랜잭션 내에서 실행한다라고 말합니다.


트랜잭션 사용법

  • 트랜잭션을 사용할 때 MySQL의 경우 START TRANSACTION 또는 BEGIN TRANSCTION 명령을 사용하며 SQL Server나 PostgreSQL의 경우 BEGIN TRANSACTION 명령만 유효합니다.
  • 그리고 Oracle과 DB2의 경우 트랜잭션을 시작하는 명령이 별도로 존재하지 않습니다. 아직 트랜잭션 부분에 대한 표준화가 진행되지 못했기 때문입니다.
  • 자동 커밋은 클라이언트 도구의 기능입니다. 따라서 트랜잭션을 사용할 경우에는 클라이언트 도구의 자동 커밋 사용 여부 등을 확인해야 합니다.
  • 예를 들면 MySQL는 mysql 클라이언트의 자동 커밋 여부를 확인해야 합니다.

보통 트랜잭션(Transaction)은 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위를 의미합니다.

따라서 하나의 명령에 트랜잭션을 걸어 실행하는 것보다 여러 명령을 묶어 하나의 단위로 실행하는 경우에 많이 사용됩니다.