@Transactional(readOnly=true)
@Transaction(read only=true) λ₯Ό μ μΈκΉ?
λ¨Όμ , νΈλμμ μ΄ νμν μ΄μ
μ΄λ€ μμμΉ λͺ»ν μν©μμ μμΈ, μ€λ₯κ° λ°μνμ¬ λ°μ΄ν° λΆμ ν©μ΄ λ°μνλ κ²½μ°, λ°μ΄ν° μμ 볡ꡬλ₯Ό ν΄μΌνλ€.
μ΄ λ λ°μ΄ν° μμ볡ꡬλ₯Ό μν΄ νΈλμμ μ΄ νμνλ€.
λ°μ΄ν° λ² μ΄μ€λ μν λ΄μμ λ‘κ·Έμ μ μ₯ν΄ λλλ°, μ΄λ₯Ό μ΄μ©ν΄ νΈλμμ μ μ§μνλ€.
- DBμ λ°μλ λ΄μ©μ μ¬λ°μνκΈ° μν Redo log
- μνμ μ€ν¨ν΄ μ΄μ μ μνλ‘ λλ리λ Undo log
readOnly=true μ€μ μ Application μΈ‘λ©΄
DataSourceTranscationManager.java
SET TRANSACTION READ ONLY
λ Oracle, MySQL, Postresμμ μ μ©λ©λλ€. λ€λ₯Έ λ°μ΄ν° λ² μ΄μ€μμλ μ μ©νκ³ μΆλ€λ©΄ λ©μλ μ¬μ μλ₯Ό ν΄μΌν©λλ€.- readOnly=true λ©΄ Slave DB, falseλ©΄ Master DB μ μ μνλλ‘ μ€μ ν μ μλ€.
HibernateTransactionManager.java
session.setFlushMode(FlushMode.MANUAL);
FlushModeλ₯Ό
MANUAL
λ‘ λ³κ²½ν΄μ Dirty checking μ μλ΅νκ² ν΄μ€λ€.β μν°ν° μ€λ μ·μ λ§λ€μ§ μλλ€.
read only= true μ€μ μ Database μΈ‘λ©΄
SET TRANSACTION READ ONLY
: νμ¬μ νΈλμμ μ ReadOnlyλ‘ μ€μ νλ€.
1. MySQL
SELECT λ¬Έμ λν΄μλ§ κΈ°λ₯μ μ§μνλ€.
- read-only μ€μ ν μνμμ Insert(update,delete)ν λμ μμΈκ° λ°μνλ€.
Read Only νΈλμμ μ λν΄μλ νΈλμμ IDκ° λΆμ¬λμ§ μλλ€. β νΈλμμ ID μ€μ μ λν μ€λ²ν€λκ° μλ€. (μ±λ₯ν₯μ)
λ³λμ μ€λ μ·μ ν΅ν΄ λ°μ΄ν°λ₯Ό μ‘°ννκΈ° λλ¬Έμ, λ°μ΄ν° μΌκ΄μ±μ 보μ₯νλ€.
2. Oracle
- SELECT κ΅¬λ¬Έλ§ μ§μνλ€.
- νΈλμμ μ΄ μμλκΈ° μ΄μ μ 컀λ°λ λ°μ΄ν°λ§ μ κ·Όν μ μκ³ , νΈλμμ μ΄ μ€νλλ λμ 컀λ°λλ λ°μ΄ν°λ κ²°κ³Όμ λ°μλμ§ μλλ€.
- μ¦, ν΄λΉ νΈλμμ λ΄μμ μΌκ΄μ μΈ λ°μ΄ν°λ₯Ό μ»λλ‘ λ³΄μ₯νλ μ©λλ€.
- μ±λ₯ μ΄μ λ§μ μν¨μ΄ μλλ€.
3. PostgreSQL
- SELECT λ₯Ό μ μΈν DDL, DML, DCL μ λμνμ§ μλλ€.
- Read/Write μμ±κ³Ό μ±λ₯ μ°¨μ΄λ₯Ό κ°μ§μ§ μλλ€. μ¦ μ½κΈ°μ μ©μΌλ‘ μ΅μ νλ₯Ό ν μ μλ€.
- ν λ¨μκ° μλ νΈλμμ λ¨μμ μ μ½μ‘°κ±΄ κ²μ¦ μ²λ¦¬λ₯Ό μ μ©νμ λ(Deffered μμ± μ μ©), SERIALIZABLE μ΄κ±°λ READ ONLY λ₯Ό μ¬μ©νκ² λμ΄ λ΄λΆ ννμ΄ μμ λμ§ μλ ν μμ ν λμμ μ§μνλ μ©λλ‘ μ¬μ©λλ€.
- μ¦ λμμ± μ μ΄λ₯Ό μν μ€μ μ΄λ€.
- νΈλμμ IDλ₯Ό μΌλ°μ μΈ IDκ° μλ κ°μ IDλ‘ μ 곡νμ¬, μ€μ λ‘λ νΈλμμ ID μκ° μ€μ΄λ€κ² λλ―λ‘ μ±λ₯μ΄ κ°μ λ μλ μλ€.
DBμμ readOnly=true μ μ¬μ©νλ μ΄μ
Lockμ μ μ©ν νμκ° μλ€.
readOnly νΈλμμ μ λ°μ΄ν°μ λν΄ Lockμ κ±Έμ§ μμλ μ κ·Όν μ μλ λ°μ΄ν°(μ€λ μ·, νν λ±)κ° λ³κ²½λμ§ μκ³ λ°μ΄ν° μΌκ΄μ±μ 보μ₯ν μ μλ€.
μ±λ₯μ μ΄μ μ΄ μλ€.
νΈλμμ ID μ€μ μ λν μ€λ²ν€λλ₯Ό μ€μ΄κ±°λ, λ°μνμ§ μκΈ° λλ¬Έμ μ±λ₯μ μ΄μ μ΄ μλ€.
Conclusion
λ°μ΄ν° μΌκ΄μ±μ 보μ₯νλ©° μΆκ° μμ μ λν μ€λ²ν€λλ₯Ό μ€μ¬ μ±λ₯μ ν₯μμν¬ μ μλ€.
- μΌλ°μ μΌλ‘ JPA(hibernate)λ₯Ό μ°λ κ²½μ° Dirty Checkingμ νμ§ μμμΌλ‘μ¨ μ€λ μ·μ μ°λ μ€λ²ν€λλ₯Ό νΌν μ μλ€.(μΈμ λ©λͺ¨λ¦¬ κ³΅κ° μ μ½, νλ¬μ μμ κ°μ) β μ±λ₯ ν₯μ
- DB μΈ‘λ©΄μμ νΈλμμ ID μ λν μ€λ²ν€λλ₯Ό μ€μΌ μ μλ€.
Ref
https://lob-dev.tistory.com/entry/DBMS-λ³-Transaction-Read-Onlyμ-λν-λμ-λ°©μ-1
https://www.inflearn.com/questions/7185
https://sg-choi.tistory.com/598
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/datasource/DataSourceTransactionManager.html
https://thorben-janssen.com/read-only-query-hint/
'study' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Kotlin youtube μμ½μΈλ―ν κ°μλ¬Έ (0) | 2022.07.16 |
---|---|
[Java] μμ΄ν 5 μμμ μ§μ λͺ μνμ§ λ§κ³ μμ‘΄ κ°μ²΄ μ£Όμ μ μ¬μ©νλΌ (0) | 2021.05.09 |
[spring boot] mock test (2) | 2021.04.18 |
[spring boot] swagger μ μ© (0) | 2021.04.06 |