Β νΈλμμ
μ λ°μ΄ν°λ₯Ό λ€λ£¨λ κ°λ°μμκ²λ λλ μΌ λ μ μλ ν΅μ¬ μμμ΄λ€.
νμ μμ νΈλμμ
μ μ€μμ±μ μκΈ°μ, νΈλμμ
μ μ΄ν΄μ νμ© λ°©μ λ±μ λν΄μ μκ°μ μ μ§ μκ² μμνμλ€.
Β κ·Έλ κ² νΈλμμ μ λν μ΄ν΄λκ° μλΉν μ¬λΌμλ€κ³ μκ°νκ³ μ΄μ νλ‘μ νΈλ€μ μ§ννμλ€. λμ€μ ν·κ°λ¦¬λ λΆλΆλ€λ μμμ§λ§, κ·Έλλ νλ‘μ νΈ μ§νμ€ μΆκ°μ μΌλ‘ 곡λΆν΄λκ°λ©° λΆμ‘±ν λΆλΆμ μ λ©κΏ μ μμλ€.
Β μ΅κ·Ό, μ€νλ§μ λμ± λ κΉμ΄ μ΄ν΄νκ³ κΈ°μ μ μ¬μ©νκΈ° μν΄μ μ λͺ
ν κΉμνλμ μ€νλ§ κ°μλ₯Ό λ€μΌλ©° μ΄ν΄νκ³ μλ€.
νμ΅ λ΄μ© μ€ νΈλμμ
μ λν λ΄μ©μ΄ λμλλ°, κΈ°μ‘΄μ μκ³ μλ κ²λ€μ΄ μκ°λ³΄λ€ λ μμ μ§μλ€μ΄μλ€λ κ±Έ λλΌκ² λμλ€.
Β νΈλμμ μ λμ μ리μ νλ¦, κ·Έ μμμ μλνλ κ²λ€μ λν΄μ μ’ λ κΉκ² 곡λΆνμκ³ , κ·Έ λΆλΆμ λν΄μ μ 리νλ μκ°μ κ°μ Έλ³΄λ €κ³ νλ€.
JDBC , JPA λ± νΉμ κΈ°μ μ μ’
μλμ§ μκ³ μΌκ΄λ λ°©μμΌλ‘ νΈλμμ
κ΄λ¦¬ κ°λ₯JDBC λ§ μ¬μ©νλ©΄ DataSourceTransactionManager κ°, JPA λ₯Ό μ¬μ©νλ©΄ JpaTransactionManager κ° μλμΌλ‘ μ€νλ§ λΉμ λ±λ‘λκ³ μ¬μ©1. νΈλμμ μμ
getTransaction() λ©μλλ₯Ό νΈμΆνμ¬ νΈλμμ
μ μλ‘ μμ±νκ³ , ν΄λΉ 컀λ₯μ
μ autoCommit(false)λ₯Ό νΈμΆgetTansaction() λ©μλ μμ± μ, νΈλμμ
μ λν μ ν, 격리 μμ€ λ±μ μΆκ°μ μΈ μ‘°κ±΄μ μ€μ ν νΈλμμ
μ μμ± κ°λ₯TransactionSynchronizationManager μ λ±λ‘DB μμ
νΈμΆμ΄ νμν λ λ±λ‘λ 컀λ₯μ
μ μ¬μ©ν¨μΌλ‘ autoCommit(false) μν μ μ§2. 컀λ°
commit() λ©μλλ‘ νΈλμμ
λ΄μ λͺ¨λ μμ
μ DB μ μꡬ λ°μ3. λ‘€λ°±
rollback() λ©μλλ‘ νΈλμμ
λ΄μ λͺ¨λ μμ
λ‘€λ°±4. μμ κ΄λ¦¬
autoCommit(true) λ₯Ό νΈμΆThreadLocal μ ν΅ν΄ λ°λ‘ 보κ΄@Component κ°μ μ΄λ
Έν
μ΄μ
μΌλ‘ μ§μ λ±λ‘νλ μΌλ°μ μΈ λΉμ΄ μλλΌ, μ€νλ§ μ체μμ λ΄λΆμ μΌλ‘ κ΄λ¦¬νλ μ νΈλ¦¬ν° ν΄λμ€μ κ·Όμ 1. ThreadLocal κ΄λ¦¬
2. λ‘€λ°± μ μ© νλκ·Έ κ΄λ¦¬
setRollbackOnly() λ©μλλ‘ νμ¬ νΈλμμ
μ λ‘€λ°± μ μ© νΈλμμ
μΌλ‘ λ§νΉrollbackOnly νλκ·Έ μ 무λ₯Ό νμΈν ν μ»€λ° λλ λ‘€λ°± μ§ν3. νΈλμμ μ 보 νμΈ
isActualTransactionActive() , isNewTransaction() λ±, νμ¬ μμ
μ€μΈ νΈλμμ
μ λν μ 보λ₯Ό νμΈ κ°λ₯TreadLocal μ μ₯ νλ1. TransactionStatus
2. Connection
DB μμ μ€μ μ°κ²°μ μ§ννλ Connection κ°μ²΄HikariCP 컀λ₯μ
νμ μ¬μ©DB μμ
μμ μ΄ λμΌν 컀λ₯μ
μ¬μ©3. EntityManager
EntityManagerFactory μμ μλ‘μ΄ Entitymanager μΈμ€ν΄μ€ μμ±EntityManagerFactory λ μ±κΈν€ λΉμΌλ‘ λ±λ‘λ κ°μ²΄EntityManager λ₯Ό μμ±νλ―λ‘, EntityManager λ μ±κΈν€μ΄ μλEntityManager λ₯Ό ThreadLocal μ μ μ₯EntityManager λ ν΄λΉ νΈλμμ
μ μμμ± μ»¨ν
μ€νΈ λ΄λΉJPA μμ EntityManager λ μμμ± μ»¨ν
μ€νΈμ κΈ°λ³Έμ μΌλ‘ 1:1λ‘ λ§€μΉλκΈ° λλ¬Έπ‘ μ ν μμ€μ λ°λ₯Έ
rollbackOnlyνλκ·Έ
rollbackOnly νλκ·Έλ 'νμ¬ νΈλμμ
μ΄ μλ‘μ΄ νΈλμμ
μΈκ°' λ₯Ό κΈ°μ€μΌλ‘ μλisNewTransaction() == true :rollbackOnly νλκ·Έ μ²΄ν¬ ν μ€μ μ»€λ° μ§νsetRollbackOnly() λ₯Ό νμ§ μκ³ λ°λ‘ 물리 DB λ‘€λ°± μ§νisNewTransaction() == false :rollbackOnly() νλκ·Έλ₯Ό true λ‘ λ³κ²½, μ΄ν ν΄λΉ λ
Όλ¦¬ νΈλμμ
μ΄ ν¬ν¨λ 물리 νΈλμμ
μ 체λ₯Ό λ‘€λ°±REQUIRES_NEWREUIQRES_NEW λ‘ μλ‘μ΄ νΈλμμ
μ΄ μ€νλλ©΄, ThreadLocal μ μ μ₯λ κΈ°μ‘΄ νΈλμμ
μ 보λ₯Ό λ΄λΆ μ€νμ μμλ‘ μ μ₯Thread μμμ λΈλ‘νΉ μ²λΌ, μ΄ν νΈλμμ
μ΄ μ’
λ£λκΈ° μ κΉμ§ λκΈ°autoCommit(false) λ‘ μ€μ ν νΈλμμ
λκΈ°ν λ§€λμ μ ThreadLocal μ λ°μΈλ©ThreadLocal νΈλμμ
μ 보λ₯Ό μλ‘μ΄ μ»€λ₯μ
μ νΈλμμ
μ λ³΄λ‘ μ€λ²λΌμ΄λ©DB μμ
μ, μ΄ μλ‘ ν λΉλ 컀λ₯μ
μ ν΅ν΄ μ§νDB μ λ°μ, μ΄ν 컀λ₯μ
νλ‘ μ»€λ₯μ
λ°νThreadLocal μ 리λ°μΈλ© ν λκΈ° μ€μ΄λ μ΄μ νΈλμμ
μ§νgetTransaction() λ©μλμ νλΌλ―Έν°μ λ±λ‘νμ¬, μνλ νΈλμμ
μμ±μ μ μ©μν¬ μ μμDefaultTransactionDefinition νΉμ λͺ κ°μ§ κΈ°λ₯μ΄ μΆκ°λ DefaultTransactionAttributes() ꡬν체λ₯Ό λ±λ‘ex)
// νΈλμμ
νλ κ·μΉ κ°μ²΄ (νμ¬ κΈ°λ³Έ ꡬν체)
DefaultTransactionDefinition definition = new DefaultTransactionAttributes();
// νΈλμμ
λ§€λμ λ ν΄λΉ κ·μΉμ΄ μ μ©λ νΈλμμ
μμ±
PlatformTransactionManager txManager = new JpaTransactionManager(definition);
1. μ ν(Propagation)
// μ ν μμ± λ³κ²½ (Default : PROPAGATION_REQUIRED)
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
2. 격리 μμ€(Isolation Level)
// 격리 μμ€ λ³κ²½ (DEFAULT :
// MySQL : ISOLATION_REPEATABLE_READ νΈλμμ
λ΄μμ κ°μ λ°μ΄ν°λ₯Ό λͺ λ² μ½μ΄λ λμΌν κ²°κ³Ό 보μ₯
// μΌλ° DB : ISOLATION_READ_COMMITED 컀λ°λ λ°μ΄ν°λ§ μ½κΈ° κ°λ₯
definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITED)
3. νμμμ(Timeout)
// νΈλμμ
μλ£κΉμ§μ μ΅λ νμ© μκ° λ³κ²½ (Default : -1, νμμμ μμ)
definition.setTimeout(30); // νΈλμμ
μ΄ 30μ΄λ₯Ό μ΄κ³Όνλ©΄ λ‘€λ°±
4. μ½κΈ° μ μ©(Read-Only)
// μ½κΈ° μ μ© νΈλμμ
μμ λͺ
μ (Default : false)
// @Transactional(readOnly = true) κ³Ό λμΌ
definition.setReadOnly(true);
π‘ μ½κΈ° μ μ© νΈλμμ μ μ‘°ν μ±λ₯ μ΅μ ν
1. JPA/Hibernate μ΅μ ν
ORM νλ μμν¬λ μ€λ
μ·μ μ μ§νκ³ λν° μ²΄νΉμ μννλ κ²μ΄ κΈ°λ³Έ2. DB λλΌμ΄λ² μ΅μ ν
3. 볡μ νκ²½(Replication) μ΅μ ν
Master DB λ μ°κΈ° λ΄λΉλ§, Slave DB λ μ½κΈ° λ΄λΉλ§ νλλ‘ λΆμ° μ²λ¦¬Slave DB λ‘ μλ λΌμ°ν
κ°λ₯Master DB λΆν κ°μSlave DB λ‘ λΆμ°μν΄μΌλ‘, Master DB λ μ€μ§ λ³κ²½ μμ
μλ§ μ§μ€ κ°λ₯Master DB μ λΆνλ₯Ό ν¬κ² μ€μμΌλ‘μ¨, DB μ μμ μ±μ λμ΄κ³ , μ°κΈ° μ±λ₯μ ν₯μμ 보μ₯ κ°λ₯Slave DB μλ² μΆκ°λ§μΌλ‘ μλ² μμ ν λ° μ±λ₯ νμ₯ κ°λ₯κ²μ) Google Gemini ( https://gemini.google.com/app )