ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ PostgreSQL๋ก ์์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ: ์ด๋ก ๊ณผ ์ค์ต - ํธ๋์ญ์ ๊ณผ ๋์์ฑ ์ ์ด
octo54 2025. 3. 8. 18:40๐ PostgreSQL๋ก ์์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ: ์ด๋ก ๊ณผ ์ค์ต
2.3 ํธ๋์ญ์ ๊ณผ ๋์์ฑ ์ ์ด
PostgreSQL์ ACID(Atomicity, Consistency, Isolation, Durability) ํธ๋์ญ์
์ ์ง์ํ๋ฉฐ,
MVCC(Multi-Version Concurrency Control, ๋ค์ค ๋ฒ์ ๋์์ฑ ์ ์ด) ๋ฅผ ํตํด ๋์์ฑ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๊ทน๋ํํฉ๋๋ค.
์ด๋ฒ ๊ธ์์๋ ํธ๋์ญ์
(Transaction)์ ๊ฐ๋
๊ณผ PostgreSQL์ ๋์์ฑ ์ ์ด ๋ฐฉ์์ ์์ธํ ์์๋ณด๊ณ ,
ํธ๋์ญ์
์ ์ค๋ฌด์์ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
2.3.1 ํธ๋์ญ์ (Transaction) ๊ฐ์
ํธ๋์ญ์
(Transaction)์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์คํ๋๋ ์ผ๋ จ์ ์ฐ์ฐ์ ํ๋์ ์์
๋จ์๋ก ๋ฌถ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ฆ, ํ๋์ ํธ๋์ญ์
์ด ์๋ฃ๋ ๋๊น์ง ๋ชจ๋ ์ฐ์ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์ํ๋์ด์ผ ํ๋ฉฐ, ์ค๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋ชจ๋ ์์
์ด ์ทจ์(ROLLBACK)๋์ด์ผ ํฉ๋๋ค.
โ ACID ํธ๋์ญ์ ํน์ฑ
ํน์ฑ ์ค๋ช
Atomicity (์์์ฑ) | ํธ๋์ญ์ ๋ด์ ๋ชจ๋ ์์ ์ด ์๋ฃ๋๊ฑฐ๋ ์ ํ ์คํ๋์ง ์์์ผ ํจ |
Consistency (์ผ๊ด์ฑ) | ํธ๋์ญ์ ์ด ์๋ฃ๋ ํ์๋ ๋ฐ์ดํฐ๋ ํญ์ ์ผ๊ด๋ ์ํ ์ ์ง |
Isolation (๊ณ ๋ฆฝ์ฑ) | ๋์์ ์คํ๋๋ ํธ๋์ญ์ ์ ์๋ก ๊ฐ์ญํ์ง ์๋๋ก ๊ฒฉ๋ฆฌ |
Durability (์ง์์ฑ) | ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ฉด ๋ฐ์ดํฐ๋ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋จ |
2.3.2 PostgreSQL์์ ํธ๋์ญ์ ์ฌ์ฉํ๊ธฐ
PostgreSQL์์๋ BEGIN, COMMIT, ROLLBACK์ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ์ ์ ์ดํ ์ ์์ต๋๋ค.
๐น ํธ๋์ญ์ ์์ (BEGIN)
BEGIN;
ํธ๋์ญ์ ์ด ์์๋๋ฉฐ, ์ดํ ์คํ๋๋ ๋ชจ๋ SQL ๋ฌธ์ด ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ ๋๋ค.
๐น ํธ๋์ญ์ ์ปค๋ฐ (COMMIT)
COMMIT;
ํธ๋์ญ์ ๋ด์์ ์คํ๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ (์ ์ฅ) ํฉ๋๋ค.
๐น ํธ๋์ญ์ ๋กค๋ฐฑ (ROLLBACK)
ROLLBACK;
ํธ๋์ญ์ ๋ด์์ ์คํ๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ทจ์(๋๋๋ฆผ) ํฉ๋๋ค.
2.3.3 ํธ๋์ญ์ ์ค์ต ์์
๐น ํธ๋์ญ์ ์ ํ์ฉํ ๋ฐ์ดํฐ ์ฝ์
BEGIN;
INSERT INTO users (name, email, age) VALUES ('Alice', 'alice@example.com', 25);
INSERT INTO users (name, email, age) VALUES ('Bob', 'bob@example.com', 30);
COMMIT;
โ ๋ ๊ฐ์ INSERT ๋ฌธ์ด ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ด๋ฉฐ, COMMIT ์คํ ํ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ฉ๋๋ค.
๐น ํธ๋์ญ์ ๋กค๋ฐฑ ์์
BEGIN;
INSERT INTO users (name, email, age) VALUES ('Charlie', 'charlie@example.com', 20);
INSERT INTO users (name, email, age) VALUES ('David', 'david@example.com', 17);
ROLLBACK;
โ
ROLLBACK ์คํ ์ ๋ชจ๋ ๋ฐ์ดํฐ ์ฝ์
์ด ์ทจ์๋ฉ๋๋ค.
(์์ ์์ David์ ๋์ด๊ฐ 18์ธ ์ด์ ์กฐ๊ฑด์ ์ถฉ์กฑํ์ง ๋ชปํด CHECK ์ ์ฝ ์กฐ๊ฑด์ด ์คํจํ ๊ฒฝ์ฐ ์ ์ฒด ํธ๋์ญ์
์ด ๋ฌดํจํ๋ฉ๋๋ค.)
2.3.4 ํธ๋์ญ์ ์ ์ฅ์ (SAVEPOINT) ์ฌ์ฉํ๊ธฐ
PostgreSQL์์๋ ํธ๋์ญ์ ์ค๊ฐ์ ์ ์ฅ์ (SAVEPOINT)์ ์ค์ ํ์ฌ ๋ถ๋ถ์ ์ผ๋ก ๋กค๋ฐฑํ ์ ์์ต๋๋ค.
๐น SAVEPOINT๋ฅผ ํ์ฉํ ๋ถ๋ถ ๋กค๋ฐฑ ์์
BEGIN;
INSERT INTO users (name, email, age) VALUES ('Eve', 'eve@example.com', 28);
SAVEPOINT my_savepoint; -- ์ ์ฅ์ ์ค์
INSERT INTO users (name, email, age) VALUES ('Frank', 'frank@example.com', 22);
ROLLBACK TO my_savepoint; -- `Frank` ๋ฐ์ดํฐ๋ง ๋กค๋ฐฑ๋จ
COMMIT; -- `Eve` ๋ฐ์ดํฐ๋ ์ ์์ ์ผ๋ก ์ ์ฅ๋จ
โ ROLLBACK TO my_savepoint๋ฅผ ์คํํ๋ฉด Frank๋ง ๋กค๋ฐฑ๋๊ณ Eve๋ ์ ์ฅ๋จ
2.3.5 ๋์์ฑ ์ ์ด์ ๊ฒฉ๋ฆฌ ์์ค (Isolation Level)
PostgreSQL์ MVCC(Multi-Version Concurrency Control, ๋ค์ค ๋ฒ์ ๋์์ฑ ์ ์ด) ๋ฅผ ์ง์ํ์ฌ,
ํธ๋์ญ์
๊ฐ ์ถฉ๋์ ์ต์ํํ๋ฉด์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํฉ๋๋ค.
MVCC๋ ๊ฐ ํธ๋์ญ์
์ด ์คํ๋ ๋ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ์ฌ ๋ณ๋์ ๋ฒ์ ์ผ๋ก ์ ์งํ๋ฏ๋ก,
ํ ํธ๋์ญ์
์ด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํด๋ ๋ค๋ฅธ ํธ๋์ญ์
์ด ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
โ PostgreSQL์ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค
๊ฒฉ๋ฆฌ ์์ค ์ค๋ช
READ COMMITTED | ๊ธฐ๋ณธ ๊ฐ. ๋ค๋ฅธ ํธ๋์ญ์ ์ COMMIT ๋ ๋ฐ์ดํฐ๋ง ์ฝ์ ์ ์์ |
REPEATABLE READ | ํธ๋์ญ์ ์์ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ฉฐ, ๋ค๋ฅธ ํธ๋์ญ์ ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ณด์ด์ง ์์ |
SERIALIZABLE | ๊ฐ์ฅ ๊ฐ๋ ฅํ ๊ฒฉ๋ฆฌ ์์ค. ์์ ํ ์ผ๊ด์ฑ์ ์ ์งํ์ง๋ง ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ |
๐น ๊ฒฉ๋ฆฌ ์์ค ์ค์ ํ๊ธฐ
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
โ ํ์ฌ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ REPEATABLE READ๋ก ๋ณ๊ฒฝ
2.3.6 ํธ๋์ญ์ ์ถฉ๋ ๋ฐ Deadlock ํด๊ฒฐ
ํธ๋์ญ์
์ด ๋์์ ์คํ๋ ๋, ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์ถฉ๋ํ ๊ฒฝ์ฐ PostgreSQL์ ์๋์ผ๋ก ํด๊ฒฐ์ ์๋ํ์ง๋ง,
์ผ๋ถ ๊ฒฝ์ฐ Deadlock(๊ต์ฐฉ ์ํ) ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
๐น Deadlock ์์
-- ํธ๋์ญ์
1
BEGIN;
UPDATE users SET age = 30 WHERE id = 1;
-- (์ ๊น)
-- ํธ๋์ญ์
2 (๋์์ ์คํ)
BEGIN;
UPDATE users SET age = 35 WHERE id = 1;
-- ํธ๋์ญ์
1์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐ ์ํ ๋ฐ์
๐น Deadlock ํด๊ฒฐ ๋ฐฉ๋ฒ
1๏ธโฃ ํธ๋์ญ์
์คํ ์์ ์กฐ์
2๏ธโฃ ๊ฒฉ๋ฆฌ ์์ค ์กฐ์ (READ COMMITTED → REPEATABLE READ)
3๏ธโฃ ํธ๋์ญ์
ํ์์์ ์ค์ (LOCK TIMEOUT)
SET lock_timeout = '5s';
2.3.7 ๊ฒฐ๋ก : ํธ๋์ญ์ ๊ณผ ๋์์ฑ ๊ด๋ฆฌ ์ต์ ํ
โ
PostgreSQL์ ACID ํธ๋์ญ์
์ ์๋ฒฝ ์ง์ํ๋ฉฐ, BEGIN, COMMIT, ROLLBACK์ ํ์ฉํ์ฌ ๊ด๋ฆฌํ ์ ์์
โ
SAVEPOINT๋ฅผ ์ด์ฉํ๋ฉด ํธ๋์ญ์
์ ์ผ๋ถ๋ง ๋กค๋ฐฑ ๊ฐ๋ฅ
โ
MVCC(Multi-Version Concurrency Control) ๋ฅผ ํตํด ๋์์ฑ ์ฑ๋ฅ์ ๊ทน๋ํ
โ
ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค (Isolation Level) ์ ์กฐ์ ํ์ฌ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง ๊ฐ๋ฅ
โ
Deadlock์ ๋ฐฉ์งํ๋ ค๋ฉด ํธ๋์ญ์
์คํ ์์๋ฅผ ์กฐ์ ํ๊ณ Lock Timeout์ ์ค์ ํด์ผ ํจ
์ด์ PostgreSQL์์ ํธ๋์ญ์
์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ตํ์ต๋๋ค!
๋ค์ ๊ธ์์๋ ๋ฐฑ์
๋ฐ ๋ณต๊ตฌ ๋ฐฉ๋ฒ์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค. ๐
๐ ๋ค์ ๊ธ ์๊ณ : PostgreSQL ๋ฐฑ์ ๋ฐ ๋ณต๊ตฌ
๐ ๋ค์ ํธ: 3.1 PostgreSQL ๋ฐฑ์ ๋ฐ ๋ณต๊ตฌ ์ ๋ต
์ด์ PostgreSQL์ ํธ๋์ญ์
๊ณผ ๋์์ฑ ์ ์ด์ ๋ํ ๊ธ์ด ์์ฑ๋์์ต๋๋ค!
๋ค์ ๊ธ์์๋ PostgreSQL ๋ฐฑ์
๋ฐ ๋ณต๊ตฌ ์ ๋ต์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค. ๐๐
'study > postgresql' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- Next.js
- babel
- Project
- github
- PostgreSQL
- Ktor
- fastapi
- ์น๊ฐ๋ฐ
- ๋ก์ปฌLLM
- nodejs
- ๊ด๋ฆฌ์
- ํ์ด์ง
- ๋ฆฌ์กํธ
- nextJS
- ๋ฐฑ์๋
- ํ๋ก ํธ์๋
- ์ฑ๋ด๊ฐ๋ฐ
- kotlin
- REACT
- Docker
- LangChain
- ๋ฐฑ์๋๊ฐ๋ฐ
- rag
- llm
- Page
- AI์ฑ๋ด
- Python
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- Webpack
- til
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |