[유튜브 방송] (즐겁게 배우는 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: 트랜잭션 예제(정상적인 경우)
- SQL> CREATE TABLE accounts ( account_no INTEGER NOT NULL, balance DECIMAL NOT NULL DEFAULT 0, PRIMARY KEY(account_no), CHECK(balance >= 0) );
- 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 );
- SQL> INSERT INTO accounts (account_no,balance) VALUES (100,20100);
- SQL> INSERT INTO accounts (account_no,balance) VALUES (200,10100);
- SQL> BEGIN TRANSACTION;
- SQL> UPDATE accounts SET balance = balance - 1000 WHERE account_no = 100;
- SQL> UPDATE accounts SET balance = balance + 1000 WHERE account_no = 200;
- SQL> INSERT INTO account_changes(account_no,flag,amount,changed_at) VALUES(100,'-',1000,datetime('now'));
- SQL> INSERT INTO account_changes(account_no,flag,amount,changed_at) VALUES(200,'+',1000,datetime('now'));
- SQL> COMMIT;
- SQL> SELECT * FROM accounts;
- SQL> SELECT * FROM account_changes;
- 단계 3: 트랜잭션 예제(롤백하는 경우)
- SQL> BEGIN TRANSACTION;
- SQL> INSERT INTO account_changes(account_no,flag,amount,changed_at) VALUES(100,'-',20000,datetime('now'));
- SQL> UPDATE accounts SET balance = balance - 20000 WHERE account_no = 100;
- SQL> SELECT * FROM account_changes;
- SQL> ROLLBACK;
- SQL> SELECT * FROM account_changes;
댓글 없음:
댓글 쓰기