
โ Transaction์ด๋?
Transaction = ์ฌ๋ฌ ์์ ์ “ํ๋์ ๋ฌถ์”์ผ๋ก ์ฒ๋ฆฌํ๋ ๋จ์
์ฌ๋ฌ SQL ์ฟผ๋ฆฌ์ ๊ฑธ์ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ(integrity)์ ๊ฐ์ ํ๋ค.
์ํ, ํญ๊ณต์ฌ, ์จ๋ผ์ธ ํฐ์ผ ์๋งค ์์คํ ๋ฑ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์ฐ์ ๋ค์์ ์ฌ์ฉํ๋ ๊ฐ๋ ์ด๋ค.
Commit; ๋๊ธฐ ์ ๊น์ง ํ Transaction์์ ๋ง๋ ๋ณ๊ฒฝ์ฌํญ์ ๋ค๋ฅธ Transaction์์ ๋ณด์ด์ง ์๋๋ค.
(SELECT, UPDATE, DELETE ๊ฐ์ ๋ฌธ๋ค์ ์ฌ์ค ํ๋์ ์์ Transaction๋ค์ด๋ค.)
Transaction์ 4๊ฐ์ง ์ฑ์ง

Transaction ์ฌ์ฉ๋ฒ
BEGIN;
UPDATE accounts
SET
balance = balance - 500
WHERE
account_holder = 'nico';
SELECT
*
FROM
accounts;
UPDATE accounts
SET
balance = balance + 500
WHERE
account_holder = 'lynn';
COMMIT;
BEGIN;์ผ๋ก Transaction์ ์ด๊ณ COMMIT;์ผ๋ก ๋ซ๋๋ค.
Save point
BEGIN;
UPDATE accounts
SET
balance = balance + 1500
WHERE
account_holder = 'lynn';
SAVEPOINT transfer_one;
RELEASE SAVEPOINT transfer_one;
SELECT
*
FROM
accounts;
UPDATE accounts
SET
account_holder = 'rich lynn'
WHERE
account_holder = 'lynn';
ROLLBACK TO SAVEPOINT transfer_one;
UPDATE accounts
SET
balance = balance - 1500
WHERE
account_holder = 'nico';
COMMIT;
SAVEPOINT๋ฅผ ์์ฑํด๋์ผ๋ฉด ROLLBACKํ ๋ ํด๋น SAVEPOINT๋ฅผ ROLLBACK TO SAVEPOINT๋ก ์ง์ ํด์ ๋๋๋ฆด ์ ์๋ค.
๊ทธ๋ฅ ROLLBACK์ ํ๊ฒ ๋๋ฉด BEGIN ์ดํ์ ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ด ์ทจ์๋๋ค.
Isolation level
Transaction์์ ๋ฐ์ํ๋ ํ์(Transaction Phenomena)์ ๋ง์์ฃผ๊ธฐ๋ ํ๋ค.
1. Read Uncommited
์์ง commit์ด ๋์ง ์์ ๋ฐ์ดํฐ๊น์ง ์ฝ์ ์ ์๋ ์์ค
2. Read Commited
commit๋ ๋ฐ์ดํฐ๋ง ์ฝ๋๋ค
3. Repeatable Read
transaction ๋์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํญ์ ๋์ผํ๊ฒ ๋ณด์ฅ
์ค๋ ์ท์ non-transaction ๋ช ๋ น๋ฌธ์ด ์คํ๋ ๋ ์ฐํ๋ค. (SELECT, UPDATE ๋ฑ ์ฒ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์๊ฐ)
4. Serializable
์ฌ๋ฌ transaction์ ๋์์ ์คํํด๋ '์์ฐจ์ ์ผ๋ก ์คํํ ๊ฒ์ฒ๋ผ' ๋ณด์ด๊ฒ ๋ง๋๋ ์์ค

Phenomena
1. dirty read
transaction์ด commit ๋์ง ์์ transaction์ด ์์ฑํ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ฝ์ ๋ ๋ฐ์ํ๋ค.
(PostgreSQL์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก Read Commited๋ผ dirty read๊ฐ ๋ฐ์ํ์ง ์๋๋ค.)
2. nonrepeatable read
๊ฐ์ row๋ฅผ ๋ ๋ฒ ์ฝ์๋๋ฐ ๊ฐ์ด ๋ฌ๋ผ์ง๋ ํ์
3. phantom read
๊ฐ์ ์กฐ๊ฑด์ผ๋ก ์กฐํํ๋๋ฐ '์๋ row๊ฐ ์๊ธฐ๊ฑฐ๋ ์ฌ๋ผ์ง๋ ํ์'
4. serialization anomaly
๋์์ ์คํ๋ transaction ๊ฒฐ๊ณผ๊ฐ '์์ฐจ์ ์ผ๋ก ์คํํ ๊ฒฐ๊ณผ์ ๋ฌ๋ผ์ง๋ ๋ฌธ์ '
https://www.postgresql.org/docs/current/transaction-iso.html
13.2. Transaction Isolation
13.2. Transaction Isolation # 13.2.1. Read Committed Isolation Level 13.2.2. Repeatable Read Isolation Level 13.2.3. Serializable Isolation Level The SQL standard …
www.postgresql.org
SELECT FOR UPDATE, SELECT FOR SHARE
commit ํ ๋๊น์ง ์๋ฌด๋ row๋ฅผ ๊ฑด๋๋ฆด ์ ์๋ค.(Lock ์์ฑ)
์ฝ๊ธฐ๋ ๊ฐ๋ฅ(SELECTํ ๋ lock์ ๊ฑธ์ง ์๋๋ค๋ฉด)
UPDATE
BEGIN;
SELECT
balance
FROM
accounts
WHERE
account_holder = 'lynn'
FOR UPDATE;
COMMIT;
UPDATE๋ exclusive lock์ ์์ฑํ๋ค.(์๋ฌด๋ ์์ ์ด๋ ์ญ์ ๋ถ๊ฐ, ๋ ๋ค๋ฅธ lock์ ์์ฑ๋ ๋ถ๊ฐ)
SHARE
BEGIN;
SELECT
balance
FROM
accounts
WHERE
account_holder = 'lynn'
FOR SHARE;
COMMIT;
SHARE๋ ์๋ฌด๋ ์์ ์ด๋ ์ญ์ ๋ ๋ถ๊ฐ๋ฅํ shared lock์ ์์ฑ, ํ์ง๋ง ๋ค๋ฅธ transaction์์ ๋ ๋ค๋ฅธ lock์ ์์ฑํ ์๋ ์๋ค.
'๐งฉ SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| SQL - PostgreSQL, JSON Column (0) | 2026.04.06 |
|---|---|
| SQL - PostgreSQL, DCL(Data Control Language) (0) | 2026.04.03 |
| SQL - PostgreSQL, Extension(plpython3) (0) | 2026.04.02 |
| SQL - PostgreSQL, Function, Procedure (0) | 2026.04.01 |
| SQL - PostgreSQL, UNNEST, DISTINCT, FULL OUTER JOIN (0) | 2026.04.01 |