@Transactional

๋“ค์–ด๊ฐ€๋ฉด์„œ

  • ์Šคํ”„๋ง์—์„œ ํŠธ๋žœ์žญ์…˜์€ @Transactional ์„ ์„ ์–ธํ•˜๋ฉด ์ ์šฉ

  • ํ•ด๋‹น ๊ธฐ๋Šฅ์€ AOP๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„.

    • AOP๊ฐ€ ์ ์šฉ๋˜์—ˆ๋Š” ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” .getClass() ๋ฅผ ํ†ตํ•ดํด๋ž˜์Šค ์ด๋ฆ„์„ ํ™•์ธํ•ด๋„ ๋จ. ($$SpringCGLIB...)

    • ํ˜น์€ AopUtils ๋ผ๋Š” ํด๋ž˜์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณผ ์ˆ˜ ๋„ ์žˆ์Œ.

    • ๊ทธ๋ฆฌ๊ณ  public ๋ฉ”์„œ๋“œ์—๋งŒ ์ ์šฉ์ด ๊ฐ€๋Šฅ. (private, protected, package-visible ์—” ์ ์šฉ์ด ์•ˆ๋จ.)

      • protected, package-visible ์˜ ๊ฒฝ์šฐ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ์€ ๊ฐ€๋Šฅํ•˜๋‚˜, ์Šคํ”„๋ง ์ž์ฒด์—์„œ ์ ์šฉ๋˜์ง€ ์•Š๋„๋ก ๋ง‰๊ณ  ์žˆ์Œ.

  • ์Šคํ”„๋ง์—์„œ ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•œ ๊ด€๋ฆฌ๋Š” TransactionSynchronizationManager ์—์„œ ๊ด€๋ฆฌ.

    • ThreadLocal์ด๋ผ, ๊ฐ ์Šค๋ ˆ๋“œ ๋ณ„๋กœ ๊ด€๋ฆฌ๋œ๋‹ค๊ณ  ๋ณด์—ฌ์ง.

@Transactional ์˜ต์…˜์—์„œ์˜ ์šฐ์„ ์ˆœ์œ„?

  • ์Šคํ”„๋ง์—์„œ ์šฐ์„  ์ˆœ์œ„?

    • ํ•ญ์ƒ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์ž์„ธํ•œ ๊ฒƒ์ด ๋” ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง.

    • ํด๋ž˜์Šค vs ๋ฉ”์„œ๋“œ -> ๋ฉ”์„œ๋“œ

    • ์ธํ„ฐํŽ˜์ด์Šค vs ํด๋ž˜์Šค(์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ) -> ํด๋ž˜์Šค (๋” ์ž์„ธํ•œ ๊ฒƒ์ด๋ฏ€๋กœ)

@Transactional(readOnly = true)
    static class LevelService {

        @Transactional(readOnly = false)
        public void write() {
            log.info("call write");
        }
    }
  • ์ด์™€ ๊ฐ™์ด ์„ ์–ธ๋˜์–ด์žˆ์„ ๋•Œ, ํ”„๋ก์‹œ๊ฐ€ ์ ์šฉ๋œ LevelSerivce#write๋ฅผ ํ˜ธ์ถœ ํ•˜๋ฉด, readOnly ์˜ต์…˜์ด false๋กœ ์ ์šฉ๋˜์–ด์„œ ์‹คํ–‰๋จ.

  • ์™œ? ๋” ๊ตฌ์ฒด์ ์ธ ๊ฒƒ(๋ฉ”์„œ๋“œ) ์— ์ ์šฉ๋œ ์˜ต์…˜์ด ๋จผ์ € ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์—

@Transactional with Interface

  • ์ธํ„ฐํŽ˜์ด์Šค์— ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์Šคํ”„๋ง์—์„œ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•.

  • ์™œ?

    • AOP๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ, ์ธํ„ฐํŽ˜์ด์Šค์— ์‚ฌ์šฉํ–ˆ์„ ๊ฒฝ์šฐ AOP๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ.

    • ์ฆ‰ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ, ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

  • ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ vs ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ

    • JDK Dynamic proxy vs CGLIB

    • ์•„๋งˆ๋„ Spring ๊ธฐ๋ณธ AOP ์ ์šฉ ๊ธฐ์ˆ ์ด CGLIB ์ฆ‰ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ด๋ ‡๊ฒŒ ๊ถŒ์žฅํ•˜๋Š” ๋“ฏ

@Transactional ์‚ฌ์šฉํ•˜๋ฉด์„œ, ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ 

๋‚ด๋ถ€ ํ˜ธ์ถœ


@Service
class CallService {

    public void external() {
        log.info("call external");
        internal();
}
    @Transactional
    public void internal() {
        log.info("call internal");
        printTxInfo();
    }

    private void printTxInfo() {
              boolean txActive = TransactionSynchronizationManager.isActualTransactionActive();
              log.info("tx active={}", txActive);
    }
}
  • Controller์—์„œ CallService#external (ํ”„๋ก์‹œ ์ ์šฉ๋œ ๊ฐ์ฒด๋ฅผ ๊ฑฐ์ณ์„œ) ๋ฅผ ํ˜ธ์ถœ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •.

  • ๊ทธ๋Ÿฌ๋ฉด external ์—์„œ, internal() ์ด ํ˜ธ์ถœ ๋  ๊ฒƒ.

  • ์ด๋Ÿด ๋•Œ @Transactional ์ด ์ ์šฉ ๋ ๊นŒ? (txActive = true?)

  • ์•ˆ๋œ๋‹ค.

  • ์™œ?

    • Proxy ๊ฐ์ฒด๋ฅผ ๊ฑฐ์ณ์„œ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, @Transactional ์ด ๋ถ™์–ด์žˆ์–ด๋„ ์•„๋ฌด๋Ÿฐ ๊ธฐ๋Šฅ์„ ํ•˜์ง€ ๋ชปํ•จ.

    • ์ฆ‰ AOP๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Œ.

  • ์ •๋ฆฌํ•˜์ž๋ฉด Spring์—์„œ AOP๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ž„.

  • ํ•ด๊ฒฐ์€ internal() ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ถ€๋ถ„์„ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ AOP๊ฐ€ ์ ์šฉ๋œ ์ƒํƒœ๋กœ ํ˜ธ์ถœ๋˜๋„๋ก ์ˆ˜์ •ํ•˜๋ฉด ๋จ.

@PostContruct ์™€ @Transactional์„ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ํŠธ๋žœ์žญ์…˜์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ

  • ์Šคํ”„๋ง ๋นˆ ๋ผ์ดํ”„ ์‚ฌ์ดํด

    1. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ

    2. ์Šคํ”„๋ง ๋นˆ ์ƒ์„ฑ

    3. ์˜์กด๊ด€๊ณ„์ฃผ์ž…

    4. ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ์‚ฌ์šฉ @PostConstruct

    5. ๋นˆ ์‚ฌ์šฉ

    6. ์†Œ๋ฉธ์ „ ์ฝœ๋ฐฑ @PreDestro

  • ๋ผ์ดํ”„ ์‚ฌ์ดํด๋กœ ๋ฏธ๋ฃจ์–ด๋ณด์•„, 4๋ฒˆ์—์„œ @PostContruct ์‹คํ–‰ํ•จ.

  • 4๋ฒˆ์—์„œ @Transactional ์— ๋Œ€ํ•œ ํ”„๋ก์‹œ ๋นˆ์ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋ชจ๋‘ ์ ์šฉ๋˜์—ˆ๋‹ค๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์—†์„๋“ฏ

    • @Transactional ์„ ๋จผ์ € ์ˆœ์„œ๊ฐ€ ์ƒ๋‹จ์— ์žˆ์–ด๋„.. ์•ˆ๋ ๋“ฏ.

  • BeanPostProcessor๋Š” 3~5๋ฒˆ ์‚ฌ์ด์— ๋™์ž‘ํ•˜๋ฏ€๋กœ.

  • ํ•ด๊ฒฐ?

  @EventListener(value = ApplicationReadyEvent.class)
  @Transactional
  public void init2() {
      log.info("Hello init ApplicationReadyEvent");
  }
  • @EventListener(value = ApplicationReadyEvent.class) ์ด์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ชจ๋‘ ์˜ฌ๋ผ์™”์„ ๋•Œ, ํ˜ธ์ถœ๋˜๋„๋ก.

@Transaciotnal ์˜ต์…˜

ํŠธ๋žœ์žญ์…˜ ์˜ˆ์™ธ, ๋กค๋ฐฑ

  • unchecked exception (Runtime exception, Error) ๋ฐœ์ƒ ์‹œ, ๋กค๋ฐฑํ•จ.

  • checked exeception (Exception) ๋ฐœ์ƒ ์‹œ, ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹.

  • ๋กœ๊ทธ ์˜ต์…˜์„ ํ†ตํ•ด, ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜ ์ง„ํ–‰์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ.

logging.level.org.springframework.transaction.interceptor=TRACE
logging.level.org.springframework.jdbc.datasource.DataSourceTransactionManager=DEBUG

#JPA log
logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG
logging.level.org.hibernate.resource.transaction=DEBUG

#JPA SQL
logging.level.org.hibernate.SQL=DEBUG
  • ์™œ ์–ธ์ฒดํฌ ์˜ˆ์™ธ๋Š” ๋กค๋ฐฑ, ์ฒดํฌ ์˜ˆ์™ธ๋Š” ์ปค๋ฐ‹?

    • ์ฒดํฌ ์˜ˆ์™ธ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ์˜ˆ์™ธ๊ฐ€ ์žˆ์Œ.

      • ๋น„์ฆˆ๋‹ˆ์Šค ์˜ˆ์™ธ? ์‹œ์Šคํ…œ์  ์˜ˆ์™ธ๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ (์ž”๊ณ  ๋ถ€์กฑ ๊ฐ™์€)

      • ๊ทธ๋ž˜์„œ ๋กค๋ฐฑ๊นŒ์ง„ ํ•˜์ง€ ์•Š์•„๋„ ๋ ๋•Œ.

      • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งŒ์•ฝ ๋กค๋ฐฑํ•ด๋ฒ„๋ฆฌ๋ฉด ๊ณ ๊ฐ์ด ์ฃผ๋ฌธํ•œ ์ฃผ๋ฌธ ์ •๋ณด๊นŒ์ง€ ์—†์–ด์ง€๋Š” ์ผ์ด ๋ฐœ์ƒ. (๋ถˆํ•„์š”ํ•œ..)

    • ์–ธ์ฒดํฌ ์˜ˆ์™ธ๋Š” ๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ๋˜์ €์…” ์‚ฌ์šฉ์ž๊ฐ€ ์•Œ๊ฒŒํ•ด์•ผํ•จ. ์‹œ์Šคํ…œ ์˜ˆ์™ธ ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋„คํŠธ์›Œํฌ ์ด์Šˆ..

์ค‘์ฒฉ๋œ ํŠธ๋žœ์žญ์…˜์—์„œ์˜ ์ปค๋ฐ‹๊ณผ ๋กค๋ฐฑ

ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ๋Š” ๊ธฐ๋ณธ ๊ฐ’์ž„ (required)

  • ํŠธ๋žœ์žญ์…˜ ์ง„ํ–‰ ์ค‘์—, ๊ทธ ํŠธ๋žœ์žญ์…˜์ด ์•„์ง ๋๋‚˜์ง€ ์•Š์•˜๋Š”(์ปค๋ฐ‹, ๋กค๋ฐฑ) ๋ฐ ๊ทธ ๋‚ด๋ถ€์—์„œ ๋˜๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ƒ์„ฑ๋œ๋‹ค๋ฉด, ์™ธ, ๋‚ด๋ถ€ ํŠธ๋žœ์žญ์…˜ ๋ชจ๋‘ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์—ฌ๊ฒจ์ง (์Šคํ”„๋ง ๊ธฐ๋ณธ ๋ฐฉ์‹)

    • ํŠธ๋žœ์žญ์…˜ ์ง„ํ–‰ ์‹œ์—, ๋˜ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•œ๋‹ค๋ฉด..

    • ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ์ ์ธ ํŠธ๋žœ์žญ์…˜์ด ์กด์žฌํ•˜๋ฉฐ, ๊ทธ ์•ˆ์—๋Š” ๋…ผ๋ฆฌ์  ํŠธ๋žœ์žญ์…˜์ด 2๊ฐœ ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ.

    • ์ฆ‰ ๋ฌผ๋ฆฌ ํŠธ๋žœ์žญ์…˜ = ๋…ผ๋ฆฌ ํŠธ๋žœ์žญ์…˜ + ๋…ผ๋ฆฌ ํŠธ๋žœ์žญ์…˜

  • ์ด ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์ด๋Š” ๊ฑด ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ฆ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋™์ž‘์„ ์ด์•ผ๊ธฐ ํ•˜๋Š” ๊ฒƒ.

  • ๋กค๋ฐฑ ์ „๋žต?

    • ๋…ผ๋ฆฌ ํŠธ๋žœ์žญ์…˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋กค๋ฐฑ๋œ๋‹ค๋ฉด, ๋ฌผ๋ฆฌ์  ํŠธ๋žœ์žญ์…˜์€ ๋กค๋ฐฑ๋จ.

    • ์ฆ‰ ๋…ผ๋ฆฌ ํŠธ๋žœ์žญ์…˜๋“ค ๋ชจ๋‘๊ฐ€ ๋ฌธ์ œ ์—†์ด ์ปค๋ฐ‹ ๋˜์–ด์•ผ, ๋ฌผ๋ฆฌ์  ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋œ๋‹ค๋Š” ์ด์•ผ๊ธฐ ์ด๊ณ , ๋ฌผ๋ฆฌ์  ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋œ๋‹ค๋Š” ๊ฑด ๊ทธ๋–„์„œ์•ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ปค๋ฐ‹์ด ๋œ๋‹ค๋Š” ์ด์•ผ๊ธฐ

  • ํŠธ๋žœ์žญ์…˜ ์‹คํ–‰ ์‹œ์—, ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ™•์ธ (TransactionSynchronizationManager๋ฅผ ํ†ตํ•ด) ํ˜„์žฌ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š” ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋Š” ์ง€ ํ™•์ธ ํ•œ๋‹ค์Œ์—, ์žˆ์œผ๋ฉด ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์„ ์ด์šฉํ•˜๋„๋ก ํ•จ.

    • ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์— ์ฐธ์—ฌํ•œ๋‹ค? == ์•„๋ฌด๊ฒƒ๋„ ์•ˆํ•œ๋‹ค๋Š” ๋œป.

    • ๋ฌผ๋ฆฌ์ปค๋„ฅ์…˜์„ ํš๋“ํ•˜๊ฑฐ๋‚˜.. ์ด๋Ÿฐ ์ผ๋ จ์˜ ์ž‘์—…์„ ํ•˜์ง€ ์•ˆํ•œ๋‹ค๋Š” ๋œป.

  • ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ์  ํŠธ๋žœ์žญ์…˜์ด ์žˆ๊ณ , 2๊ฐœ์˜ ๋…ผ๋ฆฌ์  ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

    • ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜(๋จผ์ € ์‹œ์ž‘ํ•œ ํŠธ๋žœ์žญ์…˜) ์€ ์ •์ƒ์ ์œผ๋กœ ์ปค๋ฐ‹๋˜์—ˆ๋Š”๋ฐ, ๋‚ด๋ถ€ ํŠธ๋žœ์žญ์…˜(๋‚˜์ค‘์— ์‹œ์ž‘ํ•œ)์ด ๋กค๋ฐฑ๋œ๋‹ค๋ฉด?

    • ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฌผ๋ฆฌ์  ํŠธ๋žœ์žญ์…˜์€ ๋กค๋ฐฑ๋  ๊ฒƒ์ด๊ณ .

    • ๋‚ด๋ถ€ ํŠธ๋žœ์žญ์…˜์—์„œ ๋กค๋ฐฑ๋˜์—ˆ์„ ๋•Œ, ํŠธ๋žœ์žญ์…˜์˜ ์†์„ฑ๊ฐ’(rollback-only) ๋ณ€๊ฒฝํ•˜์—ฌ, ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹ ์ „์— ํ•ด๋‹น ์†์„ฑ๊ฐ’์„ ์ฒดํฌํ•˜๋Š”๋ฐ (์ปค๋ฐ‹ํ•ด๋„ ๋ ์ง€), ์ด ๊ฐ’์ด true์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋กค๋ฐฑ๋œ๋‹ค.

    • ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋Š” ์‹ ๊ทœ ํŠธ๋žœ์žญ์…˜์ธ์ง€ ์•„๋‹Œ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ, ์ง„์งœ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋กค๋ฐฑ ํ• ์ง€, ์•„๋‹ˆ๋ฉด ์ „์—ญ ํŠธ๋žœ์žญ์…˜์— ๋งˆํฌ๋งŒ ํ• ์ง€ ๊ฒฐ์ •ํ•จ.

  • ์ •๋ฆฌํ•˜์ž๋ฉด, ๋‚ด๋ถ€ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋˜๋ฉด, ๋ฌผ๋ฆฌ์  ํŠธ๋žœ์žญ์…˜์„ ๋กค๋ฐฑํ•˜์ง„ ์•Š์Œ. ๊ทธ ๋Œ€์‹ ์— rollback-only = true ์— ๋งˆํฌํ•จ.

    • ๊ทธ๋ž˜์„œ ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์—, ํ•ด๋‹น ๊ฐ’์„ ๋ณด๊ณ , ๋กค๋ฐฑํ•ด์•ผ ๋ง์ง€ ํŒ๋‹จ. ๋งˆํฌ ๋˜์–ด์žˆ๋‹ค๋ฉด ๋ฌผ๋ฆฌ์  ํŠธ๋žœ์žญ์…˜์„ ๋กค๋ฐฑํ•˜๊ฒŒ ๋จ.

    • ๊ทธ๋ฆฌ๊ณ  UnexpectedRollbackException ์˜ˆ์™ธ๋ฅผ ๋˜์ง.

ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ

REQUIRED

  • ๊ธฐ๋ณธ

    • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•จ.

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์œผ๋ฉด, ์ฐธ์—ฌํ•จ.

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์œผ๋ฉด ์ƒ์„ฑํ•จ.

REQUIRED_NEW

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

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์žˆ์œผ๋ฉด, ์ƒˆ๋กœ ์ƒ์„ฑ.

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜ ์—†์œผ๋ฉด, ์ƒˆ๋กœ ์ƒ์„ฑ.

    • ์ฆ‰ ์™ธ๋ถ€, ๋‚ด๋ถ€๋ฅผ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•. ์ฆ‰ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž„.

  • ํ•ด๋‹น ์˜ต์…˜์˜ ํŠธ๋žœ์žญ์…˜์ด ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์—, ์ปค๋„ฅ์…˜ ํ’€์— ์ปค๋„ฅ์…˜์ด ๋ถ€์กฑํ•˜๋ฉด.. ๋ฐ๋“œ๋ฝ์ด ๊ฑธ๋ฆด ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ.

    • timeout์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋Š ์‹œ์ ์—์„œ๋Š” ๋กค๋ฐฑ๋˜๊ฒ ์ง€๋งŒ..

  • ์‘? ์ด๊ฒŒ ์™œ ๋กค๋ฐฑ๋˜๋Š”๊ฑฐ์ง€? ์ถ”๊ฐ€์ ์œผ๋กœ ์ฝ์–ด๋ด์•ผํ•  ๊ฒƒ.

SUPPORT

NOT_SUPPORT

MANDATORY

NEVER

NESTED

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์ด ์—†์œผ๋ฉด, ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ.

  • ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด, ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑ

  • ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜ ?

    • ์ด ํŠธ๋žœ์žญ์…˜์€ ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€๋งŒ, ์ด ํŠธ๋žœ์žญ์…˜์ด ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜์— ์˜ํ–ฅ์„ ์ฃผ์ง„ ์•Š์Œ.

    • e.g ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ -> ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ, ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ -> ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ๊ฐ€๋Šฅ

ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ, ์˜ต์…˜์˜ ์ ์šฉ

  • isolation, timeout, readOnly ๋“ฑ์˜ ์˜ต์…˜์„ ํŠธ๋žœ์žญ์…˜์ด ์ƒˆ๋กœ ์‹œ์ž‘ํ•  ๋•Œ๋งŒ ์ ์šฉ๋จ.

  • e.g REQUIRED ์—์„œ ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์ด ์—†๊ณ , ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•  ๋•Œ ์ ์šฉ, ์ฐธ์—ฌํ•  ๋•Œ๋Š” ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์— ์˜ต์…˜์ด ์žˆ์–ด๋„ ์ ์šฉ์ด ์•ˆ๋œ๋‹ค. (์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜ ์˜ต์…˜์ด ์ ์šฉ๋จ.)

์ฐธ๊ณ 

Last updated