트랜잭션 개념

트랜잭션은 작업의 완전성을 보장해주는 것이다. 즉 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상(Partial update)이 발생하지 않게 만들어주는 기능이다.

하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이상의 쿼리가 있든 관계없이 논리적인 작업 셋 자체가 100% 적용되거나(COMMIT을 실행했을 때) 아무것도 적용되지 않아야(ROLLBACK 또는 트랜잭션을 ROLLBACK시키는 오류가 발생했을 때) 함을 보장해주는 것이다.

Lock과 트랜잭션의 차이?

lock : 동시성 제어를 위한 기능

트랜잭션 : 데이터의 정합성을 보장하기 위한 기능

COMMIT? AUTO-COMMIT?

PostgreSQL 트랜잭션

저희 팀은 MySQL 말고, PostgreSQL을 사용하기 때문에 PostgreSQL으로 실습해봅니다 :

1. CREATE DATABASE & TABLE

postgres=# CREATE DATABASE transaction_test;
CREATE DATABASE
postgres=# -- 1. 테이블 생성
CREATE TABLE accounts (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50),
    balance DECIMAL(10,2)
);
CREATE TABLE

postgres=# -- 2. 초기 데이터 입력
INSERT INTO accounts (name, balance) VALUES
    ('홍길동', 1000000),
    ('김철수', 500000);
INSERT 0 2

2. 기본 트랜잭션 실습

postgres=# -- 3. 기본 트랜잭션 실습
BEGIN;
    -- 홍길동의 계좌에서 200000원 출금
    UPDATE accounts
    SET balance = balance - 200000
    WHERE name = '홍길동';

    -- 김철수의 계좌로 200000원 입금
    UPDATE accounts
    SET balance = balance + 200000
    WHERE name = '김철수';

    -- 트랜잭션 성공 시 커밋
    COMMIT;
    -- 실패 시 롤백하려면: ROLLBACK;
BEGIN
UPDATE 1
UPDATE 1
COMMIT

postgres=# SELECT * FROM "accounts";
 id |  name  |  balance
----+--------+-----------
  1 | 홍길동 | 800000.00
  2 | 김철수 | 700000.00
(2 rows)

3. COMMIT 안 한 상태면 DISK에 저장 안 되는 거 눈으로 보기!

4. COMMIT을 해보자