SQL - PostgreSQL, Transaction, Save Point, Isolation Level, Phenomena

2026. 4. 2. 15:31ยท๐Ÿงฉ SQL

PostgreSQL

 

 

โœ… 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
'๐Ÿงฉ SQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • SQL - PostgreSQL, JSON Column
  • SQL - PostgreSQL, DCL(Data Control Language)
  • SQL - PostgreSQL, Extension(plpython3)
  • SQL - PostgreSQL, Function, Procedure
j2yonghwa
j2yonghwa
Trying to be a fullstack developer ๐Ÿš€
  • j2yonghwa
    j2yonghwa
    j2yonghwa
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (156)
      • โฐ Daily WakaTime (1)
      • ๐Ÿ–๏ธ ๋…ธ๋งˆ๋“œ์ฝ”๋” (2)
      • ๐Ÿบ Dev Setup (3)
      • ๐Ÿ”ญ Tech Info (1)
      • ๐Ÿšซ Error (1)
      • ๐Ÿ“‚ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (23)
      • ♣๏ธ Next.js 14 (10)
      • ♠๏ธ Next.js 12 (20)
      • ๐Ÿ›ธ React Native (12)
      • ๐Ÿฆ‹ TypeScript (1)
      • ๐Ÿ Python (2)
      • ๐ŸŒŠ TailwindCSS (4)
      • ๐Ÿงฉ SQL (25)
      • ๐Ÿ’Ž Prisma (5)
      • ๐ŸŒฑ MongoDB (4)
      • ๐ŸŽฏ Redis (1)
      • ๐Ÿงฌ GraphQL (2)
      • ๐Ÿ”ฅ Firebase (7)
      • ๐Ÿ’ธ Third-Party Services (2)
      • ๐Ÿ•ธ๏ธ Web (1)
      • ๐Ÿ† ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (23)
      • ๐Ÿ“™ ๋ชจ๋”ฅ๋‹ค (5)
      • ๐Ÿ“— ์ฝ”ํ…Œ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ -JS- (0)
      • ๐Ÿ“˜ ํด๋ฆฐ์ฝ”๋“œ (0)
      • ๐Ÿฏ ๊ฟ€ํŒ ๐Ÿ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • ๊นƒํ—™
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    dev setup
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ž…๋ฌธ
    PostgreSQL
    ๋ชจ๋”ฅ๋‹ค
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    mongoDB
    SQL
    Prisma
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    next.js 14
    API
    0๋ ˆ๋ฒจ
    Next.js
    React Native
    next.js 12
    Firebase
    tailwindcss
    Python
    react router
    MySQL
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
j2yonghwa
SQL - PostgreSQL, Transaction, Save Point, Isolation Level, Phenomena
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”