본문 바로가기
SQL

[SQL] Transaction

by busybee-busylife 2025. 3. 10.
728x90

Data Integrity(무결성) 

- 은행, 항공사, 온라인 티켓 예매 시스템 등 기밀 데이터를 다루는 산업에서 중요한 개념 

- 위 산업들은 모두 transaction을 사용 

 

Transaction 

- 여러 개의 SQL 구문을 그룹화 -> 모든 변경사항을 데이터베이스에 적용(all or nothing; 그 중 하나라도 에러가 있으면 적용X)

   ex) 은행 송금 업무: 출금계좌와 입금계좌의 데이터 업데이트가 동시에 이루어져야 한다 

- 데이터의 consistency(일관성)를 유지 

- 오류 발생 시 Rollback을 통해 데이터를 원래 상태로 되돌릴 수 있음 

- 4가지 특성(ACID)을 만족해야 

    Atomicity(원자성): all or nothing 

    Consistency(일관성): transaction 실행 전 후 일관성 유지. valid state -> valid state 

    Isolation(격리성): 여러 transaction이 동시에 실행될 때, 각각이 독립적으로 실행되어야.

                                 하나의 transaction 내부에서 만든 변경사항은 commit 을 해야 다른 transaction에 반영됨 

                                  save point: transaction 내 특정 지점을 저장 

                                  https://www.postgresql.org/docs/current/transaction-iso.html

    Durability(지속성): transaction이 성공적으로 완료되면 그 변경사항이 영구적으로 저장되어야. data forever 

-- <SAVEPOINT 예제>

BEGIN TRANSACTION;

-- A 계좌에서 100원 출금
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';

-- 첫 번째 저장점 설정
SAVEPOINT sp1;

-- B 계좌에 100원 입금
UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';

-- 두 번째 저장점 설정
SAVEPOINT sp2;

-- C 계좌에 200원 입금 (에러 발생 가정)
UPDATE accounts SET balance = balance + 200 WHERE account_id = 'INVALID_ACCOUNT';

-- 오류 발생 시 sp2까지 롤백
ROLLBACK TO SAVEPOINT sp2;

-- 나머지 정상적인 부분을 커밋
COMMIT;

 


Isolation Level(격리 수준)에 따라 발생하는 Read Issue

1) Dirty Read: commit되지 않은 데이터를 읽어버림 

2) Non-Repeatable Read: 한 트랜잭션 내에서 같은 데이터를 조회할 때마다 값이 변경. 주로 업데이트할 때 발생 

3) Phantom Read: 같은 조건으로 조회했을 때, 실행 시점마다 레코드 개수가 달라짐(새로운 행이 추가되거나 삭제)


Serialization Anomaly (직렬화 이상현상)

- 트랜잭션을 병렬로 실행할 때, 서로 다른 실행 순서에 따라 데이터 결과가 달라지는 문제

- 기본적으로 Repeatable Read와 같음 

- Serialization Failure: 여러 transaction이 동시에 실행되어, 직렬(순차적)로 실행했을 때는 있을 수 없는 결과가 나타남

                                     (제대로 격리X -> 직렬화 가능한 순서를 찾지 못해 transaction이 실패) 

728x90

'SQL' 카테고리의 다른 글

[SQL] PostgreSQL JSON columns  (0) 2025.03.10
[SQL] Data Control Language  (0) 2025.03.10
[SQL] Functions and Procedures  (0) 2025.03.09
[SQL] PostgreSQL  (0) 2025.03.07
[SQL] FULLTEXT INDEX  (0) 2025.03.03