Transaction

[Database] Transaction

์˜๋ฏธ

  • ์—ฌ๋Ÿฌ๊ฐœ์˜ SQL๋ฌธ์ด ํ•˜๋‚˜๋กœ ๋ฌถ์—ฌ์žˆ๋Š” ๊ฒƒ

  • ๋‹จ์ผํ•œ ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—… ๋‹จ์œ„ (a single logical unit of work)

  • ๋…ผ๋ฆฌ์ ์ธ ์ด์œ /๋ชฉ์ ์œผ๋กœ ์—ฌ๋Ÿฌ SQL๋ฌธ๋“ค์„ ๋‹จ์ผ ์ž‘์—…์œผ๋กœ ๋ฌถ์–ด์„œ ๋‚˜๋ˆ ์งˆ ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“  ๊ฒƒ

  • transaction์˜ SQL๋ฌธ๋“ค ์ค‘์— ์ผ๋ถ€๋งŒ ์„ฑ๊ณตํ•ด์„œ DB์— ๋ฐ˜์˜๋˜๋Š” ์ผ์€ ์—†์Œ

์‚ฌ์šฉ

  • START TRANSACTION;์œผ๋กœ ์‹œ์ž‘

  • COMMIT; ์œผ๋กœ ์ข…๋ฃŒ

    • ์ง€๊ธˆ๊นŒ์ง€ ์ž‘์—…ํ•œ ๋‚ด์šฉ์„ DB์— ์˜๊ตฌ์ ์œผ๋กœ(permanently) ์ €์žฅ

    • transaction ์ข…๋ฃŒ

  • ROLLBACK; ์œผ๋กœ tansaction ์ด์ „ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ

์˜ˆ์ œ

  • Transaction : J๋Š” 100๋งŒ์›์„ ๊ฐ–๊ณ  ์žˆ๊ณ , H๋Š” 200๋งŒ์›์„ ๊ฐ–๊ณ  ์žˆ์Œ. J๊ฐ€ H์—๊ฒŒ 20๋งŒ์›์„ ๊ณ„์ขŒ์ด์ฒดํ•จ

    START TRANSACTION;
    UPDATE account SET balance = balance - 200000 WHERE id = 'J';
    UPDATE account SET balance = balance + 200000 WHERE id = 'H';
    COMMIT;
  • Rollback : J๋Š” 100๋งŒ์›์„ ๊ฐ–๊ณ  ์žˆ๊ณ , H๋Š” 200๋งŒ์›์„ ๊ฐ–๊ณ  ์žˆ์Œ. J๊ฐ€ H์—๊ฒŒ 30๋งŒ์›์„ ๊ณ„์ขŒ์ด์ฒดํ•˜๋ ค ํ•จ. J์—์„œ ์ถœ๊ธˆํ–ˆ๋Š”๋ฐ H๊ฐ€ ์ž…๊ธˆ๋ฐ›์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ(์—๋Ÿฌ)๊ฐ€ ๋ฐœ์ƒํ•จ

    START TRANSACTION;
    UPDATE account SET balance = balance - 300000 WHERE id = 'J';
    ROLLBACK;

AUTOCOMMIT

  • ๊ฐ๊ฐ์˜ SQL๋ฌธ์„ ์ž๋™์œผ๋กœ transaction์ฒ˜๋ฆฌ ํ•ด์ฃผ๋Š” ๊ฐœ๋…

  • SQL๋ฌธ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ž๋™์œผ๋กœ commit ํ•จ

  • ์‹คํ–‰ ์ค‘์— ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ์•Œ์•„์„œ rollbackํ•จ

  • MySQL์—์„œ๋Š” default๋กœ autocommit์ด enabled ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ DBMS์—์„œ๋„ ๋Œ€๋ถ€๋ถ„ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ

  • autocommit์˜ ์„ค์ •์„ ์„ธํŒ…ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

  • SELECT @@AUTOCOMMIT;

    • ํ˜„์žฌ autocommit์ด ์‚ฌ์šฉ์ค‘์ธ์ง€ ํ™•์ธํ•˜๋Š” ์ฟผ๋ฆฌ

    • 1์ด ๋ฐ˜ํ™˜๋˜๋ฉด true(ํ™œ์„ฑํ™”), 0์ด ๋ฐ˜ํ™˜๋˜๋ฉด false

    • SET autocommit=0; ์„ ํ†ตํ•ด ๋Œ ์ˆ˜ ์žˆ์Œ

    • ๋‹จ, START TRANSACTION;์œผ๋กœ ํŠธ๋žœ์ ์…˜์„ ์‹œ์ž‘ํ•˜๋ฉด, AUTOCOMMIT์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Œ. COMMIT / ROLLBACK๊ณผ ํ•จ๊ป˜ transaction์ด ์ข…๋ฃŒ๋˜๋ฉด ์›๋ž˜ autocommit์ƒํƒœ๋กœ ๋Œ์•„๊ฐ

์ผ๋ฐ˜์ ์ธ transaction ์‚ฌ์šฉ ํŒจํ„ด

  1. transaction์„ ์‹œ์ž‘(begin)ํ•จ

  2. ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ๋“ฑ์˜ SQL๋ฌธ๋“ค์„ ํฌํ•จํ•ด์„œ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•จ

  3. ์ผ๋ จ์˜ ๊ณผ์ •๋“ค์ด ๋ฌธ์ œ์—†์ด ๋™์ž‘ํ–ˆ๋‹ค๋ฉด transaction์„ commit ํ•จ

  4. ์ค‘๊ฐ„์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด transaction์„ rollbackํ•จ

java ์ฝ”๋“œ ์˜ˆ์‹œ

java_code

ACID : ํŠธ๋žœ์ ์…˜์˜ ์†์„ฑ

Atomicity Consistency Isolation Durability

Atomicity (์›์ž์„ฑ)

  • ๋ฌถ์—ฌ์žˆ๋Š” ๊ฒƒ๋“ค์ด ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์•„๋ฌด๊ฒƒ๋„ ์‹คํ–‰๋˜์ง€ ์•Š์Œ (All or NOTHING)

  • transaction์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ชผ๊ฐœ์งˆ ์ˆ˜ ์—†๋Š” ์ž‘์—… ๋‹จ์œ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€์˜ SQL๋ฌธ๋“ค์ด ๋ชจ๋‘ ์„ฑ๊ณตํ•ด์•ผ ํ•จ

  • ์ค‘๊ฐ„์— SQL๋ฌธ์ด ์‹คํŒจํ•˜๋ฉด ์ง€๊ธˆ๊นŒ์ง€์˜ ์ž‘์—…์„ ๋ชจ๋‘ ์ทจ์†Œํ•˜์—ฌ ์•„๋ฌด ์ผ๋„ ์—†์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ rollbackํ•จ

  • commit ์‹คํ–‰ ์‹œ DB์— ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜ rollback ์‹คํ–‰ ์‹œ ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ๋„ DBMS๊ฐ€ ๋‹ด๋‹นํ•จ

  • ๊ฐœ๋ฐœ์ž๋Š” ์–ธ์ œ commit ํ• ์ง€, ์–ธ์ œ rollbackํ• ์ง€, transaction ๋‹จ์œ„๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ• ์ง€ ์ž˜ ์ •ํ•ด์•ผ ํ•จ

Consistency (์ผ๊ด€์„ฑ)

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ

  • ํŠธ๋žœ์žญ์…˜์ด ํ…Œ์ด๋ธ”์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•  ๋•Œ ๋ฏธ๋ฆฌ ์ •์˜๋œ, ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹๋งŒ ์ทจํ•จ (ํ…Œ์ด๋ธ”์— ์ด๋ฏธ ์ •ํ•ด์ ธ์žˆ๋Š” constraints ๋“ฑ์— ๋Œ€ํ•ด ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ง€ํ‚ด)

  • transaction์€ DB ์ƒํƒœ๋ฅผ consistent ์ƒํƒœ์—์„œ ๋˜ ๋‹ค๋ฅธ consistent ์ƒํƒœ๋กœ ๋ฐ”๊ฟˆ

  • constraints, trigger ๋“ฑ์„ ํ†ตํ•ด ๋ฏธ๋ฆฌ DB์— ์ •์˜๋œ rules์„ transaction์ด ์œ„๋ฐ˜ํ–ˆ๋‹ค๋ฉด rollbackํ•จ

  • transaction์ด DB์— ์ •์˜๋œ rule์„ ์œ„๋ฐ˜ํ–ˆ๋Š”์ง€๋Š” DBMS๊ฐ€ commit ์ „์— ํ™•์ธํ•˜๊ณ  ์•Œ๋ ค์คŒ(error, exception throw ๋“ฑ)

  • ๊ทธ ์™ธ์— application ๊ด€์ ์—์„œ transaction์ด consistentํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฑ™๊ฒจ์•ผ ํ•จ(DBMS๋Š” DB์— ์ •์˜๋œ consistence๋งŒ ์ฑ™๊น€)

Isolation (๊ฒฉ๋ฆฌ, ๋ถ„๋ฆฌ)

  • ํŠธ๋žœ์žญ์…˜๊ณผ ํŠธ๋žœ์žญ์…˜์€ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„์•ผ ํ•จ

  • ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ (race condition ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ)

  • ์—ฌ๋Ÿฌ transaction๋“ค์ด ๋™์‹œ์— ์‹คํ–‰๋  ๋•Œ๋„ ํ˜ผ์ž ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ฆ

  • ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์ด ์—„๊ฒฉํ•˜๊ฒŒ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด ์ „์ฒด ์†๋„์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ

  • ๊ทธ๋ž˜์„œ DBMS๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ isolation level์„ ์ œ๊ณตํ•จ (์—„๊ฒฉํ•จ์˜ ์ •๋„๊ฐ€ ๋‹ค๋ฆ„)

    • ๋ ˆ๋ฒจ์ด ๋†’์œผ๋ฉด ์—„๊ฒฉ, ๋™์‹œ์„ฑ ๋‚ฎ์•„์ง, race conditionํ™•๋ฅ  ๋‚ฎ์•„์ง, ํ•˜์ง€๋งŒ ์†๋„๋Š” ๋А๋ ค์ง

    • ๋ ˆ๋ฒจ์ด ๋‚ฎ์œผ๋ฉด ๋œ ์—„๊ฒฉ, ๋™์‹œ์„ฑ ๋†’์•„์ง, race conditionํ™•๋ฅ  ๋†’์•„์ง, ํ•˜์ง€๋งŒ ์†๋„๋Š” ๋น„๊ต์  ๋น ๋ฆ„

    • ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ isolation level์„ ์„ค์ •ํ•ด์•ผ ํ•จ

  • concurrency control์˜ ์ฃผ๋œ ๋ชฉํ‘œ๊ฐ€ isolation์ž„

Durability (์˜์กด์„ฑ)

  • commit์ด ๋œ ํŠธ๋žœ์žญ์…˜์€ DB์— ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅ๋จ

  • DB system์— ๋ฌธ์ œ๊ฐ€(power fail or DB crash ๋“ฑ์œผ๋กœ ์ธํ•œ DB์„œ๋ฒ„ ์ฃฝ์Œ) ์ƒ๊ฒจ๋„ commit๋œ transaction์€ DB์— ๋‚จ์•„์žˆ์Œ

  • ์˜๊ตฌ์ ์ด๋ผ๋Š” ๋ง์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋น„ํœ˜๋ฐœ์„ฑ ๋ฉ”๋ชจ๋ฆฌ(HDD, SSD)์— ์ €์žฅํ•จ์„ ์˜๋ฏธํ•จ

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ํŠธ๋žœ์žญ์…˜์˜ durability๋Š” DBMS๊ฐ€ ๋ณด์žฅํ•จ

์ฐธ๊ณ ์‚ฌํ•ญ

  1. transaction์„ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•ด์„œ ์“ธ์ง€๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •ํ•จ. ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๊ธฐ๋Šฅ๊ณผ ACID ์†์„ฑ์„ ์ž˜ ์ดํ•ดํ•ด์•ผ ํŠธ๋žœ์žญ์…˜์„ ์ž˜ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ

  2. transaction์˜ ACID๋Š” DBMS๊ฐ€ ์•Œ์•„์„œ ๋‹ค ํ•ด์ฃผ๋Š” ๊ฒƒ์€ ์•„๋‹˜. ๋””ํดํŠธ ์„ค์ •๋ผ์žˆ๋Š” ๊ฒƒ๋„ ์žˆ์ง€๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž˜ ์ฑ™๊ฒจ์•ผ ํ•จ

์ฐธ๊ณ 

Last updated