검색엔진

월요일, 1월 11, 2021

[유튜브 방송] (즐겁게 배우는 SQL #30) 트랜잭션이 뭐지?

[유튜브 방송] (즐겁게 배우는 SQL) 기획 소개에서 설명드린 즐겁게 배우는 SQL 30편을 공개해드리겠다. 30편은 트랜잭션의 개념/기본 원리와 예를 소개한다.

2021년 1월 11일자 [즐겁게 배우는 SQL #30] 트랜잭션이 뭐지? 방송은 다음에서 볼 수 있으며, 전체 방송 플레이리스트는 즐겁게 배우는 SQL에서 확인할 수 있다.

하이라이트를 요약 정리하면 다음과 같다:

  • 00:00 트랜잭션 기본 원리 소개
  • 04:51 트랜잭션 예제(정상적인 경우)
  • 11:07 트랜잭션 예제(롤백하는 경우)

원본 학습자료는 SQLite Transaction을 참고하고, 방송에 사용한 실제 실습 자료는 다음을 참고한다:

  • 단계 1: 트랜잭션 기본 원리 소개 - ACID
    • 원자성(Atomic): 트랜잭션 내에서는 모든 연산이 모두 완료되거나 모두 실패하거나 둘 중 한 가지 상태를 보증한다. 어떤 이유로든 시도하는 변경 내역이 실패하면 전체 연산은 중단되고 마치 아무런 변경사항도 없는 것처럼 보인다.
    • 일관성(Consistent): 데이터베이스가 변경되면, 유효하며 일관된 상태로 유지된다.
    • 격리(Isolation): 여러 트랜잭션이 간섭 없이 동시에 작동할 수 있다. 이는 어떤 트랜잭션 중에 이뤄진 모든 중간 상태 변경이 다른 트랜잭션에 보이지 않게 하는 방법으로 달성된다.
    • 내구성(Durable): 일단 트랜잭션이 완료되고 나면 시스템 오류가 발생하는 상황에서도 데이터가 손실되지 않는다고 보장한다.
    BEGIN TRANSACTION;
    COMMIT;
    ROLLBACK;
    
  • 단계 2: 트랜잭션 예제(정상적인 경우)
    1. SQL> CREATE TABLE accounts ( account_no INTEGER NOT NULL, balance DECIMAL NOT NULL DEFAULT 0, PRIMARY KEY(account_no), CHECK(balance >= 0) );
    2. SQL> CREATE TABLE account_changes ( change_no INTEGER PRIMARY KEY AUTOINCREMENT, account_no INTEGER NOT NULL, flag TEXT NOT NULL, amount DECIMAL NOT NULL, changed_at TEXT NOT NULL );
    3. SQL> INSERT INTO accounts (account_no,balance) VALUES (100,20100);
    4. SQL> INSERT INTO accounts (account_no,balance) VALUES (200,10100);
    5. SQL> BEGIN TRANSACTION;
    6. SQL> UPDATE accounts SET balance = balance - 1000 WHERE account_no = 100;
    7. SQL> UPDATE accounts SET balance = balance + 1000 WHERE account_no = 200;
    8. SQL> INSERT INTO account_changes(account_no,flag,amount,changed_at) VALUES(100,'-',1000,datetime('now'));
    9. SQL> INSERT INTO account_changes(account_no,flag,amount,changed_at) VALUES(200,'+',1000,datetime('now'));
    10. SQL> COMMIT;
    11. SQL> SELECT * FROM accounts;
    12. SQL> SELECT * FROM account_changes;
  • 단계 3: 트랜잭션 예제(롤백하는 경우)
    1. SQL> BEGIN TRANSACTION;
    2. SQL> INSERT INTO account_changes(account_no,flag,amount,changed_at) VALUES(100,'-',20000,datetime('now'));
    3. SQL> UPDATE accounts SET balance = balance - 20000 WHERE account_no = 100;
    4. SQL> SELECT * FROM account_changes;
    5. SQL> ROLLBACK;
    6. SQL> SELECT * FROM account_changes;
EOB

댓글 없음:

댓글 쓰기