๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๐ŸŒฎ ๐Ÿ’ฌ
๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป/database

[Database] ํŠธ๋žœ์žญ์…˜(Transaction)

by ๋ฐ”์ฟ„๋ฆฌ 2022. 6. 30.

โœ… Transaction ?

์œ„ํ‚ค๋ฐฑ๊ณผ์— ์ •์˜๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜(Database transaction)์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๋˜๋Š” ์œ ์‚ฌํ•œ ์‹œ์Šคํ…œ(ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต๊ณผ ์‹คํŒจ๊ฐ€ ๋ถ„๋ช…ํ•˜๊ณ  ์ƒํ˜ธ ๋…๋ฆฝ์ ์ด๋ฉฐ, ์ผ๊ด€๋˜๊ณ  ๋ฏฟ์„ ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ)์—์„œ ์ƒํ˜ธ์ž‘์šฉ์˜ ๋‹จ์œ„์ด๋‹ค.

 

์‰ฝ๊ฒŒ ๋งํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—… ๋‹จ์œ„์ด๋‹ค.

 

๐Ÿ– ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ ์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์€ ์งˆ์˜์–ด(SQL : SELECT, INSERT, UPDATE, DELETE)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 

์˜ˆ) A์˜ ๊ณ„์ขŒ์—์„œ B์˜ ๊ณ„์ขŒ๋กœ 10๋งŒ์›์„ ์ด์ฒดํ•˜๋Š” ์ž‘์—…์€, A ๊ณ„์ขŒ 10๋งŒ์› ์ธ์ถœ + B ๊ณ„์ขŒ 10๋งŒ์› ์ž…๊ธˆ → 2๊ฐ€์ง€ ์ž‘์—…์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

๋‘ ์ž‘์—… ์ค‘ ํ•˜๋‚˜์˜ ์ž‘์—…์ด๋ผ๋„ ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ, ์•„๋ฌด ๊ฒƒ๋„ ์‹คํ–‰๋˜์ง€ ์•Š์€ ์ฒ˜์Œ ์ƒํƒœ๋กœ ๋ณต๊ตฌ๋˜์–ด์•ผ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฒƒ์ด Commit๊ณผ Rollback์ด๋‹ค.

โœ… Commit ?

ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ผ๊ด€์„ฑ์žˆ๋Š” ์ƒํƒœ์— ์žˆ์Œ์„ ๋งํ•œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒ์‹œ ํ•ด๋‹น ์—…๋ฐ์ดํŠธ๋ฅผ ํ™•์ •ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

โœ… Rollback ?

ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ, ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 

 

 Transaction์˜ ์ƒํƒœ 

https://github.com/JaeYeopHan/Interview_Question_for_Beginner/raw/master/Database/images/transaction-status.png

1๏ธโƒฃ Active

ํŠธ๋žœ์žญ์…˜์˜ ํ™œ๋™ ์ƒํƒœ, ํŠธ๋žœ์žญ์…˜์ด ํ˜„์žฌ ์‹คํ–‰์ค‘์ž„์„ ์˜๋ฏธํ•œ๋‹ค.

 

2๏ธโƒฃ Failed

ํŠธ๋žœ์žญ์…˜ ์‹คํŒจ ์ƒํƒœ, ํŠธ๋žœ์žญ์…˜์ด ๋” ์ด์ƒ ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

 

3๏ธโƒฃ Partially Committed

ํŠธ๋žœ์žญ์…˜์˜ Commit ๋ช…๋ น์ด ๋„์ฐฉํ•œ ์ƒํƒœ

ํŠธ๋žœ์žญ์…˜์˜ ์—ฐ์‚ฐ์ด ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์‹คํ–‰๋˜๊ณ  Commit๋งŒ ๋‚จ์€ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

4๏ธโƒฃ Committed

ํŠธ๋žœ์žญ์…˜ ์™„๋ฃŒ ์ƒํƒœ, ํŠธ๋žœ์žญ์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์–ด Commit ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

 

5๏ธโƒฃ Aborted

ํŠธ๋žœ์žญ์…˜ ์ทจ์†Œ ์ƒํƒœ, ํŠธ๋žœ์žญ์…˜์ด ์ทจ์†Œ๋˜๊ณ  Rollback์ด ์ˆ˜ํ–‰๋œ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

 

 Transaction์˜ ํŠน์ง• 

1๏ธโƒฃ ์›์ž์„ฑ Atomicity

transaction์€ DB ์—ฐ์‚ฐ์˜ ์ „๋ถ€๊ฐ€ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์‹คํ–‰๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. (All or Nothing)

์ฆ‰, ํŠธ๋žœ์žญ์…˜์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์™„์ „ํžˆ ๋๋‚˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ์—๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์€ ์ƒํƒœ์™€ ๋™์ผํ•ด์•ผํ•œ๋‹ค.

2๏ธโƒฃ ์ผ๊ด€์„ฑ Consistency

ํŠธ๋žœ์žญ์…˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ชจ์ˆœ ์—†์ด ์ผ๊ด€๋œ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.

→ ์ฆ‰, ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ ํŠธ๋žœ์žญ์…˜์€ ์ •๋‹นํ•œ ๋ฐ์ดํ„ฐ๋“ค๋งŒ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•ด์•ผ ํ•œ๋‹ค!!

3๏ธโƒฃ ๊ฒฉ๋ฆฌ์„ฑ Isolation

์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋”๋ผ๋„ ๊ฐ๊ฐ์˜ ํŠธ๋žœ์žญ์…˜์€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ˆ˜ํ–‰์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.

์ฆ‰, ๋ถ€๋ถ„์ ์ธ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๋ณผ ์ˆ˜ ์—†๋‹ค. (์œ ๋ น ์ฝ๊ธฐ ํ˜„์ƒ ๋ฐฉ์ง€)

4๏ธโƒฃ ์˜์†์„ฑ Durability

ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰์„ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋Š” ์˜๊ตฌ์ ์œผ๋กœ ๋ณด์žฅ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

 

 

 Transaction Isolation Level  : ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ 

๋™์‹œ์— ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ์ฒ˜๋ฆฌ๋  ๋•Œ, ํŠธ๋žœ์žญ์…˜์ด ์–ผ๋งˆ๋‚˜ ๊ฒฉ๋ฆฌ, ๊ณ ๋ฆฝ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

ํŠน์ • ํŠธ๋žœ์žญ์…˜์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€๊ฒฝํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ• ์ง€ ๋ง์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

 

๐Ÿ“Œ Transaction-Level Read Consistency(ํŠธ๋žœ์žญ์…˜ ์ˆ˜์ค€ ์ฝ๊ธฐ ์ผ๊ด€์„ฑ)์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค!

 

๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ 4๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

โ‘  Read Uncommitted : ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ์ฝ๊ธฐ

โ‘ก Read Committed : ์ปค๋ฐ‹๋œ ์ฝ๊ธฐ

โ‘ข Repeatable Read : ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ์ฝ๊ธฐ

โ‘ฃ Serializable : ์ง๋ ฌํ™” ๊ฐ€๋Šฅ

์œ„์—์„œ ์•„๋ž˜๋กœ ๋‚ด๋ ค์˜ฌ์ˆ˜๋ก ํŠธ๋žœ์žญ์…˜ ๊ฐ„ ๊ณ ๋ฆฝ๋„๊ฐ€ ๋†’์•„์ง€๊ณ  ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค.

 

1๏ธโƒฃ READ UNCOMMITTED

๊ฐ ํŠธ๋žœ์žญ์…˜์—์„œ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด COMMIT์ด๋‚˜ ROLLBACK ์—ฌ๋ถ€์— ์ƒ๊ด€์—†์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณด์—ฌ์ง„๋‹ค.

 

๐Ÿ“Œ Dirty Read (Uncommitted Dependency)

: ๋ณ€๊ฒฝ ํ›„ ์•„์ง commit ๋˜์ง€ ์•Š์€ ๊ฐ’ ์ฝ๊ณ , rollback ํ›„์˜ ๊ฐ’์„ ๋‹ค์‹œ ์ฝ๋Š” ํ˜„์ƒ

 

2๏ธโƒฃ READ COMMITTED

์˜ค๋ผํฐ DBMS์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ์˜จ๋ผ์ธ ์„œ๋น„์Šค์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์„ ํƒ๋˜๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค.

์–ด๋– ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ commit์ด ์™„๋ฃŒ๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ ํ…Œ์ด๋ธ” ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹Œ Undo ์˜์—ญ์— ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

 

๐Ÿ“Œ Non-Repeatable Read (Inconsistence Analysis)

: ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ๋‘๋ฒˆ ์ˆ˜ํ–‰ํ•  ๋•Œ, ๊ทธ ์‚ฌ์ด์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๊ฐ’์„ ์ˆ˜์ • ๋˜๋Š” ์‚ญ์ œํ•จ์œผ๋กœ์จ ๋‘ ์ฟผ๋ฆฌ๊ฐ€ ์ƒ์ดํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ๋น„ ์ผ๊ด€์„ฑ์ด ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ

(ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋™์ผํ•œ select๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์„ ๊ฒฝ์šฐ ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•˜๋Š” Repeatable Read ์ •ํ•ฉ์„ฑ์— ์–ด๊ธ‹๋‚œ๋‹ค.)

 

3๏ธโƒฃ REPEATABLE READ

MySQL์˜ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค.

MySQL์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜๋งˆ๋‹ค ํŠธ๋žœ์žญ์…˜ ID๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜ ID๋ณด๋‹ค ์ž‘์€ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ์—์„œ ๋ณ€๊ฒฝํ•œ ๊ฒƒ๋งŒ ์ฝ๊ฒŒ ๋œ๋‹ค.

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ํŠธ๋žœ์žญ์…˜์ด Rollback๋  ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€๋น„ํ•ด ๋ณ€๊ฒฝ๋˜๊ธฐ ์ „ ๋ ˆ์ฝ”๋“œ๋ฅผ Undo ์˜์—ญ์— ๋ฐฑ์—…ํ•ด๋‘๊ณ  ์‹ค์ œ ๋ ˆ์ฝ”๋“œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ๋ฐฉ์‹์„ MVCC : Multi Version Concurrency Control ์ด๋ผ๊ณ  ํ•œ๋‹ค.

Repeatable Read๋Š” ์ด MVCC๋ฅผ ์œ„ํ•ด Undo ์˜์—ญ์— ๋ฐฑ์—…๋œ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋Š” ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•œ๋‹ค.

* Read Committed ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ๋˜ํ•œ MVCC๋ฅผ ์ด์šฉํ•ด commit ๋˜๊ธฐ ์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ์ง€๋งŒ Repeatable Read์™€์˜ ์ฐจ์ด๋Š” Undo ์˜์—ญ์— ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „ ๊ฐ€์šด๋ฐ ๋ช‡ ๋ฒˆ์งธ ์ด์ „์˜ ๋ฒ„์ „๊นŒ์ง€ ์ฐพ์•„ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š”์ง€์— ์žˆ๋‹ค.

 

๋งŒ์•ฝ ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ ํ›„ ์žฅ์‹œ๊ฐ„๋™์•ˆ ํŠธ๋žœ์žญ์…˜์„ ์ข…๋ฃŒํ•˜์ง€ ์•Š์œผ๋ฉด Undo ์˜์—ญ์ด ๋ฐฑ์—…๋œ ๋ฐ์ดํ„ฐ๋กœ ๋ฌดํ•œ์ • ์ปค์ง€๊ฒŒ ๋œ๋‹ค. Undo ์˜์—ญ์— ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก MySQL ์„œ๋ฒ„์˜ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“Œ Phantom Read(Phantom Row)

: ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ ์ˆ˜ํ–‰ํ–ˆ๋Š” ๋ฐ,

์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์—์„œ ์กด์žฌํ•˜์ง€ ์•Š๋˜ ์œ ๋ น(phantom) ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ํ˜„์ƒ

 

4๏ธโƒฃ SERIALIZABLE

๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค.

ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ๊ณ  ์“ฐ๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ์ ˆ๋Œ€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

์™„๋ฒฝํ•œ ์ฝ๊ธฐ ์ผ๊ด€์„ฑ ๋ชจ๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ๋™์‹œ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์ด ๋‹ค๋ฅธ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€๋ณด๋‹ค ๋–จ์–ด์ง€๊ณ  ์„ฑ๋Šฅ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์—์„œ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.