<aside> <img src="https://raw.githubusercontent.com/eirikmadland/notion-icons/master/v5/icon3/ul-github.svg" alt="https://raw.githubusercontent.com/eirikmadland/notion-icons/master/v5/icon3/ul-github.svg" width="40px" /> μ°Έμ‘° Github Code

</aside>

νŠΈλžœμž­μ…˜

[μ •μ˜]

νŠΈλžœμž­μ…˜μ΄λž€ 질의(query)λ₯Ό ν•˜λ‚˜μ˜ 묢음 μ²˜λ¦¬ν•΄μ„œ λ§Œμ•½ 쀑간에 싀행이 쀑단됐을 경우, μ²˜μŒλΆ€ν„° λ‹€μ‹œ μ‹€ν–‰ν•˜λŠ”Β Rollback을 μˆ˜ν–‰ν•˜κ³ , 였λ₯˜μ—†μ΄ 싀행을 마치면 commit을 ν•˜λŠ” μ‹€ν–‰ λ‹¨μœ„λ₯Ό μ˜λ―Έν•œλ‹€. 즉, ν•œ 번 μ§ˆμ˜κ°€ μ‹€ν–‰λ˜λ©΄ μ§ˆμ˜κ°€ λͺ¨λ‘ μˆ˜ν–‰λ˜κ±°λ‚˜ λͺ¨λ‘ μˆ˜ν–‰λ˜μ§€ μ•ŠλŠ”Β μž‘μ—…μˆ˜ν–‰μ˜ 논리적 λ‹¨μœ„μ΄λ‹€.

[μ˜ˆμ‹œ]

예λ₯Ό λ“€μ–΄, μΉœκ΅¬μ—κ²Œ 인터넷 λ±…ν‚ΉμœΌλ‘œ 10,000원을 μ†‘κΈˆν•˜λŠ” 상황을 μ„€μ •. Aκ°€ Bμ—κ²Œ μ†‘κΈˆμ„ ν•œλ‹€λ©΄, A의 κ³„μ’Œμ—μ„œ 10,000원을 μ°¨κ°ν•˜κ³  B의 κ³„μ’Œμ— 10,000원을 μ¦κ°€μ‹œμΌœμ•Ό ν•˜λŠ”λ°, μ•Œ 수 μ—†λŠ” 였λ₯˜λ‘œ 인해 A의 κ³„μ’Œμ—μ„œλŠ” 10,000원이 μ€„μ—ˆμ§€λ§Œ 친ꡬ κ³„μ’Œμ—λŠ” 10,000원이 μ¦κ°€λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ λ°œμƒν•˜λŠ” 일은? A의 10,000원은 κ·Έλƒ₯ κ³΅μ€‘μœΌλ‘œ μ¦λ°œν•΄λ²„λ¦¬λŠ” λ¬Έμ œκ°€ λ°œμƒν•œλ‹€. μ΄λŸ¬ν•œ κ²½μš°κ°€ 생기지 μ•Šλ„λ‘ 쀑간에 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ λ‹€μ‹œ μ²˜μŒλΆ€ν„° μ†‘κΈˆμ„ ν•˜λ„λ‘ ν•˜λŠ” 것이 rollback이닀. 였λ₯˜ 없이 μ •μƒμ μœΌλ‘œ μ†‘κΈˆμ΄ 됐닀면 μ •μƒμ μœΌλ‘œ 싀행이 λλ‚¬μœΌλ―€λ‘œ commit처리 즉, μ†‘κΈˆ 과정을 ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄λΌ λ³Ό 수 μžˆλ‹€.

[νŠΉμ„±]

νŠΈλžœμž­μ…˜μ—λŠ” μ•„λž˜μ™€ 같이 4κ°€μ§€μ˜ νŠΉμ„±μ΄ μžˆλ‹€. 4κ°€μ§€ νŠΉμ„±μ˜ μ•ž κΈ€μžλ§Œ λ”°μ„œΒ ACID νŠΉμ„±μ΄λΌκ³  ν•œλ‹€.

[SPRINGμ—μ„œ νŠΈλžœμž­μ…˜ μ‚¬μš© 예(EX)]

private final EntityManager em;

// νŠΈλžœμž­μƒ¨ μ‚¬μš© 예
EntityTransaction transaction = em.getTransaction();
try {
    transaction.begin();
    Developer developer = Developer.builder()
            .developerLevel(DeveloperLevel.JUNGNIOR)
            .developerSkillType(DeveloperSkillType.FRONT_END)
            .experienceYear(2)
            .name("Olaf")
            .age(5)
            .build();

    developerRepository.save(developer);
    transaction.commit();
} catch (Exception em) {
    log.error("error : " + em.toString());
    transaction.rollback();
    throw new RuntimeException();
}
@Transactional