소개

[백엔드 기초] 시리즈는 SQLite을 활용하여 백엔드의 기초를 익히는 것을 목표로 합니다. 빠르고 직관적인 이해를 돕기 위해 전문적인 용어보다는 비유적인 표현을 많이 사용했습니다. 백엔드를 처음 배우는 분도 쉽게 배우고 따라하는 설명서가 되었으면 합니다.

본 시리즈가 다루는 주제는 크게 다음과 같습니다:

  • SQLite
  • RDBMS

다음과 같은 내용을 학습하시면 본 시리즈를 이해하는 데 도움이 됩니다:

  • (선수과목 없음)

         

Table of Contents


  1. Introduction
  2. Transaction
  3. Transaction의 특성
  4. Transaction을 제어하는 명령어
  5. Transaction 예시
  6. SET Transaction

         

Transaction

두명이 물건 하나를 들고 있다

출처: iStock

Transaction(트랜잭션)은 데이터베이스에 수행한 작업의 단위입니다. 새로 데이터를 생성하거나, 업데이트하거나, 삭제하는 것 모두 Transaction에 해당합니다. Transaction을 잘 관리하는 것은 매우 중요한데요, 예를 들어, 쇼핑몰 웹사이트에서 A라는 유저가 마지막 남은 상품을 장바구니에 담았는데, B라는 유저가 같은 상품을 결제해 버린다면 매우 곤란한 상황이 발생할 것입니다. 이를 방지하기 위해 발전한 개념이 바로 Transaction입니다.

 

Transaction의 특성

줄을 서서 구매중

출처: Castro Marina

Transaction은 데이터베이스에 동시에 작업이 실행되더라도 데이터베이스가 일관성을 유지하고, 문제가 생길 경우 바로 복구가 가능하게 해줍니다.

Transaction은 4가지 표준 특성을 가지고 있습니다. ACID라고 요약해서 부릅니다.

1. Atomicity (원자성)

Transaction은 하나의 단위로서, 수행하는 모든 작업이 완료되어야 성공합니다. 중간에 실패할 경우, Transaction은 중단되고 Transaction을 시작하기 전 단계로 되돌립니다.

예를 들어, 쇼핑몰에서 상품을 결제할 때, 장바구니에 담으면 일시적으로 재고가 1씩 줄어들지만, 결제를 중간에 취소할 경우, 장바구니에 들어있던 상품은 삭제되고 재고가 다시 1씩 증가해 원상복귀 됩니다.

2. Consistency (일관성)

Transaction이 성공적으로 Commit(완료 후 확정)되면 데이터베이스가 이에 맞춰 업데이트됩니다.

3. Isolation (독립성)

Transaction들은 독립적으로 운영됩니다.

유저 A와 유저 B는 각자의 장바구니에서 동시에 결제를 할 수 있습니다. (같은 물건을 담지 않았다는 가정 하에)

4. Durability (지속성)

시스템이 중간에 문제가 생기더라도 Transaction의 결과는 유지되어야 합니다. 서버에 연결이 끊겼다 돌아와도 결제 정보는 남아있어야 합니다.

 

Transaction을 제어하는 명령어

Transaction을 제어하는 명령어는 다음과 같습니다:

  • COMMIT: 변경 사항 저장하기
  • ROLLBACK: 변경 사항을 마지막 세이브포인트로 되돌리기
  • SAVEPOINT: Transaction 내의 특정 세이브포인트 생성
  • SET TRANSACTION: Transaction에 이름 부여

Transaction 도중에는 INSERT, UPDATE, DELETE 등 데이터를 변경시키는 조작만 가능하며, CREATE TABLE, DROP TABLE과 같은 조작은 수행할 수 없습니다.

 

Transaction 예시

데이터베이스 기초 시리즈에서 예를 들었던 scholarship Table로 예제를 수행해 봅시다.

Scholarship

studentId Name GPA Amount
1 Matt 4.0 10,000
2 John 3.0 5,000
3 Tom 3.5 7,000
4 Kathy 1.5  
5 Amy 4.0 10,000
SQL Table 생성 코드 보기
  CREATE TABLE scholarship (
      id INT PRIMARY KEY,
      name VARCHAR(50),
      GPA DECIMAL(3,1),
      amount DECIMAL(10, 2)
  );

  INSERT INTO scholarship (id, Name, GPA, amount) VALUES
  (1, 'Matt', 4.0, 10000),
  (2, 'John', 3.0, 5000),
  (3, 'Tom', 3.5, 7000),
  (4, 'Kathy', 1.5, NULL),
  (5, 'Amy', 4.0, 10000);

 

  • GPA가 1.5인 학생을 삭제하고, 삭제를 취소하기

    SQL> DELETE FROM scholarship
          WHERE GPA = 1.5;
    
    SQL> ROLLBACK;
    

    결과: DELETE가 취소되었기 때문에 scholarship Table에는 변화가 없습니다.

    id  name  GPA  amount
    --  ----  ---  ------
    1   Matt  4.0  10000
    2   John  3.0  5000
    3   Tom   3.5  7000
    4   Kathy 1.5
    5   Amy   4.0  10000
    

 

  • 세이브포인트 생성하기

    특정한 시점으로 ROLLBACK을 하길 원한다면 세이브포인트를 생성하고 특정 시점으로 돌아갈 수 있습니다.

      SQL> DELETE FROM scholarship
            WHERE GPA = 1.5;
    
      SQL> SAVEPOINT delete_15;
    
      SQL> DELETE FROM scholarship
            WHERE GPA = 3.0;
    
      SQL> ROLLBACK TO delete_15;
    

    결과:

    GPA가 3.0인 학생이 삭제된 결과는 Rollback 되었지만, 1.5인 ‘Kathy’는 여전히 삭제된 상태입니다.

    id  name  GPA  amount
    --  ----  ---  ------
    1   Matt  4.0  10000
    2   John  3.0  5000
    3   Tom   3.5  7000
    5   Amy   4.0  10000
    

 

  • 세이브포인트 삭제하기 RELEASE SAVEPOINT savepoint_name을 사용하면 세이브포인트가 제거됩니다.

 

SET TRANSACTION 명령어

SET TRANSACTION은 데이터베이스를 조작할 수 있는 범위를 제어하는 명령어입니다. 아래와 같이 사용합니다.

SET TRANSACTION [ READ WRITE | READ ONLY ];
  • Read Only: 데이터를 불러올 수만 있고, 변형시킬 수는 없습니다.
  • Read-Write: 데이터를 불러오고 변형시킬 수 있습니다.

누군가 데이터베이스에 접근해서 마음대로 데이터를 조작하거나 삭제하는 것을 방지하는 데 유용한 기능입니다.

   


         

자료 출처