Spring Transaction Propagation Options

๊น€์˜ํ•œ๋‹˜ ์Šคํ”„๋ง DB 2ํŽธ - ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ  ํ™œ์šฉ ๊ฐ•์˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

REQUIRED ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” default ์„ค์ •. ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์ด ์—†์œผ๋ฉด ์ƒ์„ฑํ•˜๊ณ  ์žˆ์œผ๋ฉด ์ฐธ์—ฌํ•œ๋‹ค. ํŠธ๋žœ์žญ์…˜์ด ํ•„์ˆ˜๋ผ๋Š” ์˜๋ฏธ๋กœ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค(ํ•„์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์—†์œผ๋ฉด ๋งŒ๋“ค๊ณ , ์žˆ์œผ๋ฉด ์ฐธ์—ฌํ•œ๋‹ค) ์‹ค๋ฌด์—์„œ ๋Œ€๋ถ€๋ถ„ REQUIRED ์‚ฌ์šฉ

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ: ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ
  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ: ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์— ์ฐธ์—ฌ

REQUIRES_NEW ํ•ญ์ƒ ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑ

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ: ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ
  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ: ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ

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

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ: ํŠธ๋žœ์žญ์…˜ ์—†์ด ๋กœ์ง ์ˆ˜ํ–‰
  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ: ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์ฐธ์—ฌ

NOT_SUPPORTED ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ: ํŠธ๋žœ์žญ์…˜ ์—†์ด ๋กœ์ง ์ˆ˜ํ–‰
  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ: ํŠธ๋žœ์žญ์…˜ ์—†์ด ๋กœ์ง ์ˆ˜ํ–‰(๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์€ ๋ณด๋ฅ˜ํ•œ๋‹ค)

MANDATORY ์˜๋ฌด์‚ฌํ•ญ์ด๋‹ค. ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์ด ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์ด ์—†์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ: IllegalTransactionStateException ๋ฐœ์ƒ
  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ: ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์— ์ฐธ์—ฌ

NEVER ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ. ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜๋„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ•ํ•œ ๋ถ€์ •์˜ ์˜๋ฏธ๋กœ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ: ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ง„ํ–‰
  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ: IllegalTransactionStateException ๋ฐœ์ƒ

NESTED

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์Œ: ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ
  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์Œ: ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์„ ๋งŒ๋“ ๋‹ค.
    • ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์€ ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜์— ์˜ํ–ฅ์„ ๋ฐ›์ง€๋งŒ, ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์€ ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
    • ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ ๋˜์–ด๋„ ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜์€ ์ปค๋ฐ‹ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋˜๋ฉด ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜๋„ ํ•จ๊ป˜ ๋กค๋ฐฑ๋œ๋‹ค. (REQUIRES_NEW๋ž‘ ์ฐจ์ด์ )
  • NESTED๋Š” JPA์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์Œ.

Method Signature

๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” ์ž๋ฐ” ํด๋ž˜์Šค ๋‚ด์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ๋‚ด์—์„œ ๋‘ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ๊ฐ™์€ Signature๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฉ”์„œ๋“œ ์ด๋ฆ„
  • ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜
  • ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์˜ ์ˆœ์„œ

Example

  public class Temp {

    public String myMethod(String s1, Integer i1) { }
    public String myMethod(String s2, Integer i2) { }
  }

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด์ž. ๋น„๋ก ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์ด s1, s2๊ฐ€ ๋‹ค๋ฅด์ง€๋งŒ ๋˜‘๊ฐ™์€ String ํƒ€์ž…์ด๊ณ , ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ ์—ญ์‹œ ์ด๋ฆ„์€ ๋‹ค๋ฅผ์ง€์–ธ์ • ํƒ€์ž…์€ ๋™์ผํ•˜๋‹ค. ์ค‘์š”ํ•œ ์ ์€ method signature๊ฐ€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ™์€ ํด๋ž˜์Šค์— 2๊ฐœ ์ด์ƒ ์กด์žฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ํด๋ž˜์Šค๋Š” ์ปดํŒŒ์ผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. return type์€ method signature์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ return type์ด method signature์— ํฌํ•จ๋œ๋‹ค๋ฉด ์• ๋งคํ•ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฆ„๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜, ํƒ€์ž…์€ ๊ฐ™ใ…‡๋Š๋ฐ ํ•˜๋‚˜๋Š” Integer, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Double์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด JVM์€ ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ• ์ง€ ๊ฒฐ์ •ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— return type์€ method signature์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ