๊ฐœ๋ฐœ์ž HOON
๐Ÿ› HOON DEVLog
๊ฐœ๋ฐœ์ž HOON
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๐Ÿ˜Ž ์ „์ฒด ์นดํ…Œ๊ณ ๋ฆฌ (137)
    • ๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„ (7)
    • ๐Ÿฆ” ์ทจ์—…์ค€๋น„ ๊ธฐ๋ก (7)
    • โ˜• ์ž๋ฐ” : JAVA (5)
    • ๐Ÿ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„ : PS (80)
    • ๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend (13)
    • ๐Ÿงช ์ปดํ“จํ„ฐ๊ณผํ•™ : CS (11)
    • ๐Ÿ—‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : DB (1)
    • ๐Ÿƒ‍โ™‚๏ธ DEVLOG (8)
    • โš™๏ธ Trouble Shooting (5)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • GitHub
  • Resume

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
๊ฐœ๋ฐœ์ž HOON

๐Ÿ› HOON DEVLog

[Spring] @Transactional๊ณผ DB Lock์— DeepDive - (1) DB ํŠธ๋žœ์žญ์…˜, ์‚ฌ์šฉ๋ฐฉ๋ฒ•, ๊ฒฉ๋ฆฌ์ˆ˜์ค€, ์ „ํŒŒ ๋‹จ๊ณ„ ํ›‘์–ด๋ณด๊ธฐ
๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend

[Spring] @Transactional๊ณผ DB Lock์— DeepDive - (1) DB ํŠธ๋žœ์žญ์…˜, ์‚ฌ์šฉ๋ฐฉ๋ฒ•, ๊ฒฉ๋ฆฌ์ˆ˜์ค€, ์ „ํŒŒ ๋‹จ๊ณ„ ํ›‘์–ด๋ณด๊ธฐ

2023. 3. 21. 20:12

 

๐Ÿค” 0. DB ํŠธ๋žœ์žญ์…˜

๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ์ตœ์†Œ ๋‹จ์œ„์˜ ์ž‘์—…์ด๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ, commit()์„ ํ†ตํ•ด ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๋“ ์ง€ ์•„๋‹ˆ๋ฉด rollback()์„ ํ†ตํ•ด ๋ชจ๋‘ ์ทจ์†Œ๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—… ๋‹จ์œ„.

 

ํŠธ๋žœ์žญ์…˜์€ DB์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•˜๋‚˜์˜ ์ž‘์—… ๋‹จ์œ„์— ์†ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ INSERT, UPDATE, DELETE ๋“ฑ์˜ SQL๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด, ์ž๋™์œผ๋กœ ํ•œ ๋ผ์ธ๋งˆ๋‹ค ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์–ด Commit์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ํŠธ๋žœ์žญ์…˜์˜ ์˜์—ญ์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด, ํ•œ ํŠธ๋žœ์žญ์…˜ ์•ˆ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ช…๋ น๋ฌธ์„ ๋„ฃ๋„๋ก ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

START TRANSACTION;

....

COMMIT;

 

ํŠธ๋žœ์žญ์…˜์€ ์šฐ๋ฆฌ๋ง๋กœ '๊ฑฐ๋ž˜'๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, A์™€ B๊ฐ€ ๊ฑฐ๋ž˜๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ A๊ฐ€ B์—๊ฒŒ ๋ˆ์„ ์ž…๊ธˆ ํ–ˆ์œผ๋‚˜, B์—๊ฒŒ ์‚ฌ์ •์ด ์ƒ๊ฒจ ๋ฌผ๊ฑด์„ ๋ณด๋‚ด์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค! ์ด ๊ฒฝ์šฐ, A๋Š” B์—๊ฒŒ ๋ˆ์„ ๋Œ๋ ค๋ฐ›์•„์•ผ๊ฒ ์ฃ ? ์›๋ž˜ ๊ฑฐ๋ž˜๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „ ์ƒํ™ฉ์œผ๋กœ ๋˜๋Œ์•„๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์—์„œ์˜ DB ํŠธ๋žœ์žญ์…˜๋„ ์ด์™€ ์œ ์‚ฌํ•œ ์˜๋ฏธ๋กœ ์ƒ๊ฐํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ž‘์—… ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํŠธ๋žœ์žญ์…˜ ์ž‘์—… ๋‹จ์œ„ ๋‚ด์˜ ๋ชจ๋“  ์ž‘์—…์„ ์›์ƒํƒœ๋กœ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์ฃ .

 

ํŠธ๋žœ์žญ์…˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

- Commit : ํŠธ๋žœ์žญ์…˜ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜ ๋‚ด๋ถ€์˜ ์ž‘์—… ๋ณ€๊ฒฝ์„ ๋ชจ๋‘ ์Šน์ธํ•˜๊ณ  ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
- Rollback : ํŠธ๋žœ์žญ์…˜ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ์ž‘์—…์„ ๊ฒฐ๊ณผ์— ๋ฐ˜์˜์‹œํ‚ค์ง€ ์•Š๊ณ , ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ ์ด์ „์˜ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.

 

 

๐Ÿค” 1. @Transactional์˜ ์‚ฌ์šฉ๋ฐฉ๋ฒ•

 

์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„ ์›Œํฌ์ธ ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง์€ @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•œ ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

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

 

1. ์–ด๋””์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€?

@Transactional์€ ๋ฉ”์„œ๋“œ, ํด๋ž˜์Šค ์œ„์— ๋ถ™์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ฉ”์„œ๋“œ๋Š”, ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์— ๋ฌถ์—ฌ ๊ด€๋ฆฌ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ผ์ด ๊ฐ€๋Šฅ์ผ€ ๋˜๋Š” ์ด์œ (์ž‘๋™์›๋ฆฌ)์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

@Transactional์„ ๋ฉ”์„œ๋“œ์™€ ํด๋ž˜์Šค ๋ ˆ๋ฒจ์— ๋ถ™์˜€์„ ๋•Œ, ์šฐ์„ ์ˆœ์œ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

(์šฐ์„ ์ˆœ์œ„ ๋†’์Œ) ๋ฉ”์„œ๋“œ > ํด๋ž˜์Šค > interface method > interface (์šฐ์„ ์ˆœ์œ„ ๋‚ฎ์Œ)

 

์ด๋Ÿฌํ•œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ๊ณตํ†ต์ ์ธ ํŠธ๋žœ์žญ์…˜ ๊ทœ์น™์€ ํด๋ž˜์Šค์—, ํŠน๋ณ„ํ•œ ๊ทœ์น™์€ ๋ฉ”์„œ๋“œ์— ๋ถ™์ด๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ž๋ฐ” ์–ด๋…ธํ…Œ์ด์…˜์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ ๋‚˜ AspectJ ๊ธฐ๋ฐ˜์—์„œ ํŠธ๋žœ์žญ์…˜ ์„ค์ •์„ ์ธ์‹ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐํŽ˜์ด์Šค ๋ณด๋‹ค๋Š” ํด๋ž˜์Šค์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

+ @Transactional์€ ์ผ๋ฐ˜์ ์œผ๋กœ Proxy ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Public ๋ฉ”์†Œ๋“œ์— ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ ‘๊ทผ์ œ์–ด์ž์— ๋Œ€ํ•ด์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

2. @Transactional์˜ ์˜ต์…˜

<์‚ฌ์šฉ ์˜ˆ์‹œ>

    @Transactional(isolation = Isolation.READ_COMMITTED, 
            propagation = Propagation.REQUIRED, 
            readOnly = true,  
            timeout = 30, 
            noRollbackFor = {SQLException.class}, 
            rollbackFor = {EntityNotFoundException.class})

 

  • isolation :
    • ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์„ค์ •, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์— ์–ด๋А์ •๋„ ๊ฐœ์ž…ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ˆ˜์ค€ ์„ค์ •์ด ๊ฐ€๋Šฅ.
    • ๋’ท ๋ถ€๋ถ„์—์„œ ์ถ”๊ฐ€๋กœ ๋‹ค๋ฃฐ ์˜ˆ์ •
  •  propagation :
    • ํŠธ๋žœ์žญ์…˜ ๋™์ž‘ ๋„์ค‘, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์„ ํ˜ธ์ถœ ํ•  ๋•Œ, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€, ์ „ํŒŒ๋˜๋Š”์ง€ ์„ค์ •์ด ๊ฐ€๋Šฅ.
    • ๋’ท ๋ถ€๋ถ„์—์„œ ์ถ”๊ฐ€๋กœ ๋‹ค๋ฃฐ ์˜ˆ์ •
  • noRollbackFor : 
    • ํŠน์ • ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ rollback์ด ๋™์ž‘ํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •
  • rollbackFor : 
    • ํŠน์ • ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ rollback์ด ๋™์ž‘ํ•˜๋„๋ก ์„ค์ •
  • timeout : 
    • ์ง€์ •ํ•œ ์‹œ๊ฐ„ ๋‚ด์— ๋ฉ”์†Œ๋“œ ์ˆ˜ํ–‰์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด rollback์ด ๋™์ž‘ํ•˜๋„๋ก ์„ค์ •
  • readOnly : 
    • ํŠธ๋žœ์žญ์…˜์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ค์ •

 

3. rollbackFor์™€ noRollbackFor ์˜ต์…˜

์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜์—์„œ๋Š”, ๊ธฐ๋ณธ์ ์œผ๋กœ RuntimeException์— ๋Œ€ํ•ด ๋กค๋ฐฑ์„ ํ•˜๋„๋ก ์„ค์ •์ด ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. 

By default, a transaction will be rolling back on RuntimeException and Error but not on checked exceptions (business exceptions).

- docs ๋„์ค‘ ๋ฐœ์ทŒ

๊ทธ๋Ÿฌ๋‚˜ Checked Exception์— ๋Œ€ํ•ด์„œ๋Š” ์ด๋Ÿฌํ•œ ๋กค๋ฐฑ ์ฒ˜๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ "CheckedException์ด๋ผ๊ณ  ํ•ด์„œ, ๋ฐ˜๋“œ์‹œ ๋กค๋ฐฑ์„ ํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค."๋ผ๊ณ  ๊ทœ์ •๋˜์–ด ์žˆ๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. 

๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ์—์„œ "UncheckedException๊ณผ CheckedException์— ๋Œ€ํ•ด ๊ฐ๊ฐ ๋กค๋ฐฑ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค, ํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค"์™€ ๊ฐ™์ด ๋‹จ์–ธํ•ด์„œ ์ •๋ฆฌํ•ด ๋†“์€ ๊ธ€์„ ๋งŽ์ด ๋ณด์•˜๋Š”๋ฐ, ๋ฐฑ๊ธฐ์„ ๋‹˜์˜ ์œ ํŠœ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•ด ์ด๋Ÿฌํ•œ ์ ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์งš์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ๋กค๋ฐฑ์˜ ์—ฌ๋ถ€๋Š” ์˜จ์ „ํžˆ ๊ฐœ๋ฐœ์ž์˜ ๋ชซ์ž…๋‹ˆ๋‹ค. CheckedException์ด๋ผ๊ณ  ํ•˜๋”๋ผ๋„, ๋กค๋ฐฑ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์ด๋ฉด rollbackFor ์˜ต์…˜์— ํ•ด๋‹น Exception class๋ฅผ ์ถ”๊ฐ€ํ•ด ๋กค๋ฐฑ์„ ์œ ๋„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์—ญ์‹œ RuntimeException์—์„œ๋„, ๋กค๋ฐฑ์„ ๊ธˆ์ง€์‹œํ‚ฌ Exception์ด ์žˆ๋‹ค๋ฉด noRollbackFor ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด ๋กค๋ฐฑ์„ ํ•˜์ง€ ์•Š๋„๋ก ์œ ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

4. readOnly์˜ ํšจ๊ณผ

readOnly์˜ ๋œป์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์€ ์ฝ๊ธฐ ์ „์šฉ์ด๋ผ๊ณ  ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

readOnly ์˜ต์…˜์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

- ์ˆ˜์ •, ์‚ญ์ œ, ์‚ฝ์ž… ์—ฐ์‚ฐ์— ๋Œ€ํ•ด ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ํŠธ๋žœ์žญ์…˜์ด๋ผ๋Š” ์˜๋ฏธ๋กœ, ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ด ์ž˜๋ชป ๋“ค์–ด๊ฐ„ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๋ฐฉ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•จ.
- readOnly๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋‚ด๋ถ€์ ์ธ ์†๋„ ๊ฐœ์„ ์ด ๊ฐ€๋Šฅ.

 

์ด๋Ÿฌํ•œ ํšจ๊ณผ๋ฅผ ๋ณด์•˜์„ ๋•Œ, ์šฐ๋ฆฌ๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉ์‹œํ‚ฌ ๋•Œ ์ฝ๊ธฐ ์ „์šฉ์ด๋ผ๊ณ  ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์—๋Š” ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ฆฌ์ด๋ฏ€๋กœ ์ด๋Ÿฌํ•œ readOnly์˜ ๋‚ด๋ถ€ ๋™์ž‘์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ์ •๋ฆฌํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿค” 2. ํŠธ๋žœ์žญ์…˜์˜ ๊ณ ๋ฆฝ ๋‹จ๊ณ„

 

๋ชจ๋“  DB ํŠธ๋žœ์žญ์…˜์€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(๊ณ ๋ฆฝ ๋‹จ๊ณ„)์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”ํžˆ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ํŠธ๋žœ์žญ์…˜์˜ ์†์„ฑ ACID ์ค‘, I๊ฐ€ ๋ฐ”๋กœ isolation์ธ ๊ณ ๋ฆฝ์„ฑ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ๋Œ€ํ•œ ์„ค์ •์œผ๋กœ ๊ณ ๋ฆฝ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์ฃ .

 

์„œ๋ฒ„ ํ™˜๊ฒฝ์„ ๊ฐœ๋ฐœํ•˜๋ฉด, ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ ๊ณ ๋ฆฝ์„ฑ์„ ๋†’๊ฒŒ ์„ค์ •ํ•œ๋‹ค๋ฉด, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋œ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ณ ๋ฆฝ์„ฑ์€ ํ•ญ์ƒ ๊ณ ๋ ค๋˜์–ด์•ผ ํ•  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๊ณ ๋ฆฝ์„ฑ์„ ๋†’๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋™์‹œ์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๊ณ ๋ฆฝ์„ฑ์„ ๋†’๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋™์‹œ์„ฑ์ด ๋–จ์–ด์ง€๊ณ , ๋™์‹œ์„ฑ์„ ๋†’์ด๋ฉด ๊ณ ๋ฆฝ์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋‘ ๊ฐ€์ง€์˜ ์†์„ฑ์€ trade-off ๊ด€๊ณ„์— ์žˆ๋Š” ๊ฒƒ์ด์ฃ .

 

๊ทธ๋Ÿผ ๊ณ ๋ฆฝ์„ฑ์„ ๋‚ฎ์ท„์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ด ์žˆ์„๊นŒ์š”?

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” DB ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€ ์„ค์ •๊ณผ ํ•จ๊ป˜ ์•Œ์•„๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค!

 

 

 

@Transactional(isolation = Isolation.DEFAULT)

๊ธฐ๋ณธ์œผ๋กœ ์„ ํƒ๋œ ํŠธ๋žœ์žญ์…˜์˜ ๊ณ ๋ฆฝ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์ž์‹ ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” datasource์— ์˜ํ•ด ์ด๋Ÿฌํ•œ DEFAULT ๊ฐ’์ด ์ •ํ•ด์ง‘๋‹ˆ๋‹ค. 

์ฆ‰, ์•ž์œผ๋กœ ๋‚˜์˜ฌ

  • READ_UNCOMMITTED
  • READ_COMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE

์ค‘์—์„œ DataSource๊ฐ€ ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ์„ ํƒํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์„ ํƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

@Transactional(isolation = Isolation.READ_UNCOMMITTED)

๊ฐ€์žฅ ๋‚ฎ์€ ๋‹จ๊ณ„์˜ ๊ณ ๋ฆฝ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. 

์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์ค‘ ํ˜น์€ ์ปค๋ฐ‹๋˜๊ธฐ ์ด์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ฝ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ A๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ B๋ผ๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋Š” B๋ผ๋Š” ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€(Uncommitted ํ˜น์€ Dirty) ๋ฐ์ดํ„ฐ B๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ถœ์ฒ˜ : byteslounge.com

 

READ_UNCOMMITTED์—์„œ ๋ฐœ์ƒํ•˜๋Š” Dirty Read๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

A ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ , B ํŠธ๋žœ์žญ์…˜์—์„œ ์•„์ง ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๋“ค์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ A ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ์ด ๋œ๋‹ค๋ฉด, A์˜ ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ์ ์šฉ๋˜์ง€ ์•Š๊ณ  ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ B ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ์ด๋ฏธ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๋“ค์˜€์œผ๋ฏ€๋กœ, ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํš๋“ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜„์ƒ์€ ๋ฌด๊ฒฐ์„ฑ์„ ๊นจ๋œจ๋ฆฌ๋ฏ€๋กœ, Dirty Read๊ฐ€ ์œ„ํ—˜ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

@Transactional(isolation = Isolation.READ_COMMITTED)

์ด๋Ÿฌํ•œ Dirty Read ํ˜„์ƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๊ฒฉ๋ฆฌ์ˆ˜์ค€์„ ํ•œ ๋‹จ๊ณ„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ๋ฐ”๋กœ READ_COMMITTED์ž…๋‹ˆ๋‹ค.

์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋งŒ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•ด์„œ ์ฝ์–ด๋“ค์ผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์ฃ .

์ปค๋ฐ‹์ด ์•ˆ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๋“ค์ผ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ Dirty Read์™€ ๊ฐ™์€ ํ˜„์ƒ์€ ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ, READ_COMMITTED์—๋„ ํ ์ด ์—†๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : byteslounge.com

 

 

์œ„์™€ ๊ฐ™์€ Flow๋ฅผ ๋ณด๊ฒŒ ๋˜๋ฉด, ํŠธ๋žœ์žญ์…˜ A์—์„œ๋Š” x=1์˜ ์กฐ๊ฑด์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ 2ํšŒ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ ์‚ฌ์ด์— ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ์‹คํ–‰๋˜์–ด x=1์˜ ์กฐ๊ฑด์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ˆ˜์ • / ์‚ญ์ œ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์ปค๋ฐ‹์„ ํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, A ํŠธ๋žœ์žญ์…˜์—์„œ ์ฒซ ๋ฒˆ์งธ Read์™€, ๋‘ ๋ฒˆ์งธ Read๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ–๊ฑฐ๋‚˜ (์ˆ˜์ •์˜ ๊ฒฝ์šฐ), ๋‘ ๋ฒˆ์งธ Read์—์„œ ์•„์˜ˆ ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(์‚ญ์ œ์˜ ๊ฒฝ์šฐ)

์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ Non-repeatable reads๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๊ฐ™์€ ์กฐ๊ฑด์— ๋Œ€ํ•œ read๊ฐ€ ๋™์ผํ•˜์ง€ ์•Š์€ ๊ฐ’์„ ์–ป๋Š”๋‹ค๋Š” ํ˜„์ƒ์ด์ฃ .

 

 

@Transactional(isolation = Isolation.REPEATABLE_READ)

์กฐ๊ธˆ ๋” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ๋†’์—ฌ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. REPEATABLE_READ๋กœ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์˜ฌ๋ฆฌ๊ฒŒ ๋˜๋ฉด, ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต ์กฐํšŒ๋ฅผ ํ•˜๋”๋ผ๋„ ๊ฐ™์€ ๊ฐ’์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ถœ์ฒ˜ : byteslounge.com

 

์ด๋ ‡๊ฒŒ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ๋†’์˜€์Œ์—๋„, ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•œ read๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜ B์—์„œ๋Š” ํ•ด๋‹น ๋ฒ”์œ„ ๋‚ด๋ถ€์— ์†ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช… ํŠธ๋žœ์žญ์…˜ A์—์„œ ๊ฐ™์€ ์กฐ๊ฑด์œผ๋กœ ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ํ–ˆ์ง€๋งŒ, ์ฒซ ๋ฒˆ์งธ์™€ ๋‘ ๋ฒˆ์งธ์˜ Read๋Š” ๊ฐ๊ฐ ๊ฒฐ๊ณผ ๊ฐ’์ด ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ Phantom Read (์œ ๋ น์ฝ๊ธฐ)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

@Transactional(isolation = Isolation.SERIALIZABLE)

๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ๊ณ  ์“ฐ๋Š” ๋‚ด์šฉ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ ์ ˆ๋Œ€๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ๋‚˜์˜จ ๋ชจ๋“  ํ˜„์ƒ์— ๋Œ€ํ•ด ์ œ๊ฑฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋™์‹œ์„ฑ์ด ์ง€๋‚˜์น˜๊ฒŒ ๋–จ์–ด์ ธ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค.

 

 

์ถœ์ฒ˜ : https://www.codeproject.com/Articles/1190420/Database-Transactions-with-Spring-Framework

 

 

๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ์–ด๋–ค ๊ฒƒ์ž„์„ ํ™•์ธํ–ˆ์ง€๋งŒ, MySQL์—์„œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์˜ ์„ค์ •์— ๋”ฐ๋ผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€๋Š” ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ์ •๋ฆฌํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

๐Ÿค” 3. ํŠธ๋žœ์žญ์…˜์˜ ์ „ํŒŒ ๋‹จ๊ณ„

 

ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ๋Š”, ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฝ๊ณ„์—์„œ ์ด๋ฏธ ์ง„ํ–‰ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์žˆ์„ ๋•Œ, ๋˜๋Š” ์—†์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, A ๋ฉ”์†Œ๋“œ์— ํŠธ๋žœ์žญ์…˜์„ ์„ค์ •ํ•˜๊ณ , B ๋ฉ”์†Œ๋“œ์— ํŠธ๋žœ์žญ์…˜์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. A ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์—์„œ B ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

์ด ๊ฒฝ์šฐ, A ๋ฉ”์†Œ๋“œ์˜ ํŠธ๋žœ์žญ์…˜์ด ๋ชจ๋‘ ๋๋‚˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ, B ๋ฉ”์†Œ๋“œ์˜ ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด๋Ÿฌํ•œ B์˜ ์ฝ”๋“œ๋Š” ์–ด๋–ค ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ• ๊นŒ์š”?

์ด๋Ÿฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- A์—์„œ ์ด๋ฏธ ์‹œ์ž‘ํ•œ ํŠธ๋žœ์žญ์…˜์— ํŽธ์ž…
- ์•ž์—์„œ ์ด๋ฏธ ์‹œ์ž‘๋œ A ํŠธ๋žœ์žญ์…˜๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋…๋ฆฝ์ ์ธ B ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰

์ด๋Ÿฐ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ „ํŒŒ ๋‹จ๊ณ„์˜ ์กฐ์ •์ž…๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ „ํŒŒ๋‹จ๊ณ„์˜ ์กฐ์ •์€ @Transactional์˜ propagation ์˜ต์…˜์„ ์„ ํƒํ•ด์„œ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

@Transactional(propagtion = Propagation.REQUIRED)

๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์ง„ํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๊ณ , ์ด๋ฏธ ์‹คํ–‰๋œ ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์œผ๋กœ ํŽธ์ž…๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์ „ํŒŒ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์„œ๋กœ ๊ฒฐํ•ฉํ•ด ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ ์›ํ™œํ•ฉ๋‹ˆ๋‹ค. 

์•„๋ž˜์™€ ๊ฐ™์ด ๊ธฐ๋ณธ์ ์ธ ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ์†์„ฑ์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ์–ด์„œ, ๊ตณ์ด propagation ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ž๋™ ์ ์šฉ ๋ฉ๋‹ˆ๋‹ค.

 

 

@Transactional(propagtion = Propagation.REQUIRES_NEW)

ํ•ญ์ƒ ์ƒˆ๋กœ์šด, ๋…๋ฆฝ์ ์ธ ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ์ „ํŒŒ ์ „๋žต์ž…๋‹ˆ๋‹ค. ์•ž์—์„œ ์‹œ์ž‘๋œ ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋“  ์—†๋“  ์ƒ๊ด€์—†์ด ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ๋งŒ๋“ค์–ด์„œ ๋…์ž์ ์œผ๋กœ ๋™์ž‘๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋…๋ฆฝ์ ์ธ ํŠธ๋žœ์žญ์…˜์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์— ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐ๊ฐ์˜ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋˜๋”๋ผ๋„, ์ „ํ˜€ ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

 

@Transactional(propagtion = Propagation.MANDATORY)

์œ„์—์„œ ๋ณด์•˜๋˜, REQUIRED ์ „ํŒŒ ์ „๋žต๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ํŽธ์ž…์ด ๋œ๋‹ค๋Š” ์ ์—์„œ ๊ต‰์žฅํžˆ ๋น„์Šทํ•˜์ง€๋งŒ, ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์ด ์—†๋‹ค๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค๋Š” ์ฐจ์ด์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Mandatory๋Š” 'ํ•„์ˆ˜์ ์ธ'์ด๋ผ๋Š” ๋œป์œผ๋กœ ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•˜๋Š” ์˜๋ฏธ๋กœ ํ•ด๋‹น ๋‹จ๊ณ„ ์ž‘๋ช…์„ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

@Transactional(propagtion = Propagation.SUPPORTED)

์œ„์—์„œ ๋ณด์•˜๋˜, REQUIRED ์ „ํŒŒ ์ „๋žต๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ํŽธ์ž…์ด ๋œ๋‹ค๋Š” ์ ์—์„œ ๊ต‰์žฅํžˆ ๋น„์Šทํ•˜์ง€๋งŒ, ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์ด ์—†๋‹ค๋ฉด xํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์ฐจ์ด์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

@Transactional(propagtion = Propagation.NESTED)

- ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์ด ์—†๋Š” ๊ฒฝ์šฐ : ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•ด์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

- ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋Š” ๊ฒฝ์šฐ : ์œ„์˜ ์˜ˆ์‹œ๋“ค๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ, '์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜'์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์€ ๋‚ด๋ถ€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด ๋กค๋ฐฑ์ด ๋œ๋‹ค๋ฉด, ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜๋งŒ ๋กค๋ฐฑํ•ฉ๋‹ˆ๋‹ค.

์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋˜์–ด๋„, ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์—๋Š” ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์€ ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์ด ๋ชจ๋‘ ๋๋‚˜๊ณ  ์ปค๋ฐ‹๋˜๋Š” ์‹œ์ ์— ๊ฐ™์ด ์ปค๋ฐ‹๋ฉ๋‹ˆ๋‹ค. (๋ชจ๋“  ์ปค๋ฐ‹์€ ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์ด ๋๋‚  ๋•Œ ํ•œ ๋ฒˆ.)

๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑํ•˜๋ฉด, ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜๋„ ๋กค๋ฐฑ๋ฉ๋‹ˆ๋‹ค.

 

 

@Transactional(propagtion = Propagation.NEVER)

ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

 

 

 

 

๐Ÿ ์ถœ์ฒ˜

[๋„์„œ] ํ† ๋น„์˜ ์Šคํ”„๋ง 3.1
[๋งํฌ] https://www.youtube.com/watch?v=_WkMhytqoCc&t=152s (๋ฐฑ๊ธฐ์„ ๋‹˜ ์œ ํŠœ๋ธŒ)
[๋งํฌ] https://tecoble.techcourse.co.kr/post/2021-05-25-transactional/ (tecoble)
[๋งํฌ] https://data-make.tistory.com/738
[๋งํฌ] https://brush-up.github.io/java/java-springboot-transactional/
[๋งํฌ] https://www.codeproject.com/Articles/1190420/Database-Transactions-with-Spring-Framework
[๋งํฌ] https://incheol-jung.gitbook.io/docs/q-and-a/db/isolation-level
[๋งํฌ] https://steady-coding.tistory.com/562
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋™์ผ์กฐ๊ฑด (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring] Spring Security + OAuth2.0 + JWT Token์„ ํ™œ์šฉํ•œ ์†Œ์…œ๋กœ๊ทธ์ธ ์ด์ •๋ฆฌ - (1) ๋ฐฐ๊ฒฝ ์ง€์‹ ์ดํ•ดํ•˜๊ธฐ, ์ „์ฒด ๊ทธ๋ฆผ ์‚ดํŽด๋ณด๊ธฐ  (0) 2023.09.22
[Spring] API ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Swagger ๋„์ž…ํ•˜๊ธฐ (gradle ๊ธฐ์ค€)  (0) 2023.03.24
[Spring] @ControllerAdvice์™€ @ExceptionHandler  (0) 2023.03.18
[Spring WebFlux] 1. Mono์™€ Flux์— ๋Œ€ํ•œ ์ดํ•ด(2) : ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” operator (method)  (0) 2023.01.06
[Spring WebFlux] 1. Mono์™€ Flux์— ๋Œ€ํ•œ ์ดํ•ด(1) : ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์ดํ•ด  (0) 2023.01.06
    '๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Spring] Spring Security + OAuth2.0 + JWT Token์„ ํ™œ์šฉํ•œ ์†Œ์…œ๋กœ๊ทธ์ธ ์ด์ •๋ฆฌ - (1) ๋ฐฐ๊ฒฝ ์ง€์‹ ์ดํ•ดํ•˜๊ธฐ, ์ „์ฒด ๊ทธ๋ฆผ ์‚ดํŽด๋ณด๊ธฐ
    • [Spring] API ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Swagger ๋„์ž…ํ•˜๊ธฐ (gradle ๊ธฐ์ค€)
    • [Spring] @ControllerAdvice์™€ @ExceptionHandler
    • [Spring WebFlux] 1. Mono์™€ Flux์— ๋Œ€ํ•œ ์ดํ•ด(2) : ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” operator (method)
    ๊ฐœ๋ฐœ์ž HOON
    ๊ฐœ๋ฐœ์ž HOON
    ์ข‹์€ ๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก์„ ๋ชจ์•˜์Šต๋‹ˆ๋‹ค. # ์ฃผ๋‹ˆ์–ด # ๋ฐฑ์—”๋“œ # ๊ฐœ๋ฐœ์ž

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