ν°μ€ν 리 λ·°
νΈλμμ μ 격리 μμ€(isolation level)μ λν΄μ μ ννκ² μ΄ν΄νλ κ²μ μ ν리μΌμ΄μ λ‘μ§μ μ ννκ² μ μ΄νλ κ²μ μμ΄μ μ€μν©λλ€. νμ§λ§ 격리 μμ€μ΄ ꡬ체μ μΌλ‘ μ΄λ»κ² λμνλμ§ μ ννκ² λͺ¨λ₯΄κ³ μμλ μ¬μ€μ λ°κ²¬ν΄μ μ¬νμ΅μ μν΄ λ΄μ©μ μ 리ν©λλ€.
μ΄ κΈμ MySQL κΈ°μ€μΌλ‘ μμ±ν©λλ€.
νΈλμμ 격리 μμ€
격리 μμ€μ ν¬κ² λ€μκ³Ό κ°μ΄ 4κ°μ§λ‘ λ€μκ³Ό κ°μ΄ λλκ² λ©λλ€.
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
1λ²μμ 4λ²μΌλ‘ κ°μλ‘ νΈλμμ
κ°μ λ°μ΄ν° 격리 μμ€μ΄ λμμ§λ©°, λμ μ²λ¦¬ μ±λ₯μ΄ λ¨μ΄μ§λ κ²μ΄ μΌλ°μ μ
λλ€.
κ·Έλ¦¬κ³ λ³΄ν΅ SERIALIZABLE μ λκ° μλλ©΄ ν¬κ² μ±λ₯μ κ°μ μ΄λ μ νλ λ°μνμ§ μμ΅λλ€.
μΌλ°μ μΈ μ¨λΌμΈ μλΉμ€ μ©λμ λ°μ΄ν°λ² μ΄μ€μμλ READ COMMITTEDμ REPEATABLE READ μ€ νλλ₯Ό μ¬μ©ν©λλ€.
μ€μ λ‘ μ€λΌν΄μμλ READ COMMITTED μμ€μ λ§μ΄ μ¬μ©νλ©°, MySQLμμλ REPETABLE READλ₯Ό μ£Όλ‘ μ¬μ©ν©λλ€.
SQL-92 λλ SQL-99 νμ€μ λ°λ₯΄λ©΄ REPETABLE READλ₯Ό μ¬μ©νλ©΄ λ°μ΄ν° λΆμ ν© λ¬Έμ κ° μμ μ μμ§λ§, MySQL InnoDBμ κ²½μ°λ μΈλ λ‘κ·Έ λ± λ
νΉν νΉμ±μΌλ‘ μΈν΄ λΆμ ν© λ¬Έμ κ° λ°μνμ§ μκ³ μμ νκ² μ¬μ© κ°λ₯ν©λλ€.
νΈλμμ 격리 μμ€κ³Ό λ°μ΄ν° λΆμ ν© λ¬Έμ
νΈλμμ
격리 μμ€μ μ΄μΌκΈ°νλ©΄ λ°μ΄ν° λΆμ ν© λ¬Έμ λ κ°μ΄ μ΄ν΄νκ³ μμ΄μΌ ν©λλ€.
μ΄λ₯Ό μ μ΄ν΄νλ©΄ μ°λ¦¬λ μ¬μ©μμκ² μλνλλ‘ λ°μ΄ν°λ₯Ό 보μ¬μ£Όλλ‘ μ ν리μΌμ΄μ
λ‘μ§μ μμ νκ² μ μ΄ν μ μμ΅λλ€.
λνμ μΈ λΆμ ν© λ¬Έμ λ λ€μκ³Ό κ°μ΄ 3κ°μ§κ° μ‘΄μ¬ν©λλ€.
- DIRTY READ
- NON-REPEATABLE READ
- PHANTOM READ
νΈλμμ 격리 μμ€μ λν΄ μμΈν μμ보기 μ μ λ°μ΄ν° μ ν©μ± λ¬Έμ λ₯Ό λ¨Όμ μμΈνκ² μμλ΄ μλ€.
DIRTY READ
DIRTY READλ μ΄λ€ νΈλμμ
μ΄ μ²λ¦¬ν μμ
μ΄ μλ£λμ§ μμλλ°λ λ€λ₯Έ νΈλμμ
μμ λ³Ό μ μλ νμμ λ§ν©λλ€.
λ§ κ·Έλλ‘ μ μμ μ΄μ§ μκ³ μ€μΌλ λ°μ΄ν°λ₯Ό μ½μ μ μλ€λ μλ―Έμ
λλ€.
- νΈλμμ μ΄ μ€ν¨ν μλ μμΌλ―λ‘ μ‘κΈκ³Ό κ°μ λ°μ΄ν° μ ν©μ±μ΄ μ€μν λλ©μΈμμλ DIRTY READλ μ¬κ°ν λ¬Έμ μ λλ€.
- READ UNCOMMITTED 격리 μμ€μμλ DIRTY READκ° νμ©λλ©° RDBMS νμ€μμλ READ UNCOMMITTEDλ₯Ό νΈλμμ μ 격리 μμ€μΌλ‘ μΈμ νμ§ μμ μ λλ‘ μ ν©μ±μ λ¬Έμ κ° λ§λ€κ³ νλ¨νκ³ μμ΅λλ€.
NON-REPEATABLE READ
NON-REPEATABLE READλ λ§ κ·Έλλ‘ ν νΈλμμ
μμ κ°μ SELECT μΏΌλ¦¬λ‘ λ°μ΄ν°λ₯Ό λ°λ³΅μ μΌλ‘ μ½μμ λ λ°μ΄ν°κ° λ¬λΌμ§λ λΆμ ν© λ¬Έμ λ₯Ό λ§ν©λλ€.
μ¦, ν νΈλμμ
λ΄μμλ λκ°μ SELECT 쿼리λ₯Ό μ€ννμ λ νμ κ°μ κ²°κ³Όλ₯Ό κ°μ ΈμμΌνλ€λ REPETABLE READ μ ν©μ±μ μ΄κΈλλ νμμ
λλ€.
PHANTOM READ
PHANTOM READλ λ€λ₯Έ νΈλμμ
μ΄ μνν λ³κ²½ μμ
μ μν΄ λ μ½λκ° λ³΄μλ€ μ 보μλ€νλ νμμ μ§μΉν©λλ€.
μ¦, ν νΈλμμ
μμ κ°μ μΏΌλ¦¬λ‘ λ°μ΄ν°λ₯Ό λ€μ μ‘°ννμ λ κΈ°μ‘΄κ³Ό λ€λ₯Έ κ²°κ³Όκ° λμ¬ μ μλ λ°μ΄ν° λΆμ ν©μ
λλ€.
NON-REPEATABLE READμ κ°μ κ±° μλκ°? νλ μκ°μ΄ λ€μ§λ§ ꡬ체μ μΌλ‘ μ‘°κΈ λ€λ¦
λλ€.
PHANTOM READ λΆμ ν©μ "SELECT ... FOR UPDATE" 쿼리 μ€ν μμ λνμ μΌλ‘ λ°μν©λλ€.
MySQLμμλ REPEATABLE READ 격리 μμ€μ 보μ₯νκΈ° μν΄ μΈλ λ‘κ·Έμμ νμ¬ νΈλμμ
λ²νΈλ³΄λ€ μ΄μ μ μ€νλ μΈλ λ‘κ·Έλ₯Ό κΈ°λ°μΌλ‘ λ°μ΄ν°λ₯Ό μ‘°ννλ ꡬ쑰λ₯Ό κ°μ§κ³ μμ΅λλ€.
κ·Έλ¦¬κ³ MySQLμ "SELECT ... FOR UPDATE" 쿼리λ SELECT νλ λ μ½λμ μ°κΈ° μ κΈμ κ±Έμ΄μΌ νλλ°,
μΈλ λ‘κ·Έλ ꡬ쑰μ μΌλ‘ append onlyλ§ κ°λ₯νκ² κ΅¬μ±λμ΄ μμ΄μ μΈλ λ‘κ·Έμλ μ κΈμ κ±Έ μ μλ€. κ·Έλμ 쿼리 μμ μΈλ λ‘κ·Έκ° μλ μ€μ λ μ½λμμ κ°μ κ°μ Έμ€κ² λ©λλ€.
λ°λΌμ "SELECT ... FOR UPDATE" μΏΌλ¦¬κ° "SELECT * FROM users WHERE age > 20"κ³Ό κ°μ΄ λ²μ£ΌνμΌλ‘ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ κ²½μ°λΌλ©΄ λ°μ΄ν°κ° 보μλ€ μ 보μλ€νλ PHANTOM READ νμμ΄ λ°μν μ μλ ꡬ쑰μ λλ€.
μ ν©μ± λ¬Έμ λ₯Ό λ¨Όμ μ΄ν΄λ΄€μΌλ μ΄μ κ° κ²©λ¦¬ μμ€μ λν΄μ μμλ΄ μλ€.
READ UNCOMMITTED
READ UNCOMMITTEDλ μ΄λ¦μμ μ μ μλ―μ΄ μ»€λ°λμ§ μμ λ΄μ©μ μ½μ μ μμ΅λλ€.
μ¦, νΈλμμ
μμμ λ³κ²½ λ΄μ©μ COMMITμ΄λ ROLLBACK μ¬λΆμ μκ΄μμ΄ λ€λ₯Έ νΈλμμ
μμ λ³Ό μ μλ 격리 μμ€μ
λλ€.
μμμ λΆμ ν© λ¬Έμ μ ν¨κ» μμλ΄€λ―μ΄ READ UNCOMMITTED 격리 μμ€μμλ DIRTY READκ° νμ©λλ©° RDBMS νμ€μμλ READ UNCOMMITTEDλ₯Ό νΈλμμ μ 격리 μμ€μΌλ‘ μΈμ νμ§ μμ μ λλ‘ μ ν©μ±μ λ¬Έμ κ° λ§λ€κ³ νλ¨νκ³ μμ΅λλ€.
READ COMMITTED
READ COMMITTEDλ μ΄λ¦ κ·Έλλ‘ λ€λ₯Έ νΈλμμ
μμ 컀λ°μ΄ μλ£λ λ°μ΄ν°λ§ μ½μ μ μλ 격리 μμ€μ
λλ€.
μ€λΌν΄ DBMSμμ κΈ°λ³ΈμΌλ‘ μ¬μ©λλ 격리 μμ€μ΄λ©°, μ¨λΌμΈ μλΉμ€μμ κ°μ₯ λ§μ΄ μ ννκ³ μμ΅λλ€.
READ UNCOMMITTEDμ λ¬λ¦¬ DIRTY READ λΆμ ν©μ΄ λ°μνμ§ μμ΅λλ€.
MySQLμμλ νμ¬ νΈλμμ μ΄ λ°μ΄ν°λ₯Ό λ³κ²½νλ©΄ λ³κ²½ μ λ°μ΄ν°λ₯Ό μΈλ λ‘κ·Έμ λ°±μ λ°μ΄ν°λ‘ μμ΅λλ€. κ·Έλ¦¬κ³ λ§μ½ λ€λ₯Έ νΈλμμ μμ ν΄λΉ λ°μ΄ν°λ₯Ό μ‘°ννκ³ μΆλ€λ©΄ ν΄λΉ μΈλ λ‘κ·Έμμ λ°μ΄ν°λ₯Ό μ‘°ννμ¬ READ COMMITTEDλ₯Ό 보μ₯ν©λλ€.
νμ§λ§ READ COMMITTEDμμλ NON-REPEATABLE READ λΆμ ν© λ¬Έμ κ° λ°μν μ μμ΅λλ€.
A νΈλμμ
μμ νΉμ λ°μ΄ν°λ₯Ό μ‘°ννμ λ λ°μ΄ν°κ° μμμ§λ§ B νΈλμμ
μμ μλ‘μ΄ λ°μ΄ν°λ₯Ό μΆκ° ν 컀λ°νλ€λ©΄, A νΈλμμ
μμ λ€μ λ°μ΄ν°λ₯Ό μ‘°ν μ λ°μ΄ν°κ° μ‘΄μ¬ν μλ μμ΅λλ€. μ΄λ νΈλμμ
격리 μμ€μ΄ μμ ν μ κΈμ κΈ°λ₯μ νλ 건 μλκΈ° λλ¬Έμ κ°λ₯ν νμμΌλ‘ 보μ
λλ€.
NON-REPEATABLE READ λΆμ ν©μ REPEATABLE READ 격리 μμ€μ μ¬μ©νλ©΄ ν΄κ²°ν μ μμ΅λλ€.
REPEATABLE READ
REPEATABLE READλ NON-REPEATABLE READ λΆμ ν©μ΄ λ°μνμ§ μλ νΈλμμ
격리 μμ€μ
λλ€.
MySQLμ InnoDBμμ κΈ°λ³ΈμΌλ‘ μ¬μ©λλ 격리 μμ€μ΄κ³ λ°μ΄λ리 λ‘κ·Έλ₯Ό κ°μ§ MySQL μλ²μμλ μ΅μ REPEATABLE READ 격리 μμ€ μ΄μμ μ¬μ©ν΄μΌ ν©λλ€.
InnoDBμμλ νΈλμμ μ΄ rollbackλ κ°λ₯μ±μ λλΉνκΈ° μν΄ λ³κ²½λκΈ° μ λ°μ΄ν°λ₯Ό μΈλ λ‘κ·Έμ λ°±μ ν΄λκ³ μ€μ λ μ½λ κ°μ λ³κ²½ν©λλ€. μ΄λ¬ν λ°©μμ MVCC(Multi version Concurrency Control)μ΄λΌκ³ νλ©° μΈλ λ‘κ·Έμ λ°±μ ν΄λ λ°μ΄ν°λ₯Ό νμ©ν΄ κ°μ νΈλμμ λ΄μμλ λμΌν κ²°κ³Όλ₯Ό λ³Ό μ μλλ‘ λ³΄μ₯ν©λλ€.
InnoDBμ νΈλμμ μ μμ°¨μ μΌλ‘ μ¦κ°νλ κ³ μ ν νΈλμμ λ²νΈλ₯Ό κ°μ§λ©° μΈλ λ‘κ·Έμλ νΈλμμ λ²νΈκ° ν¬ν¨λκ³ μ΄ νΈλμμ λ²νΈλ₯Ό κΈ°μ€μΌλ‘ λ°μ΄ν°μ μμ μ 보μ₯ν©λλ€.
νμ§λ§ REPEATABLE READ 격리 μμ€μμλ μμμ μμλ΄€λ PHANTOM READ λΆμ ν©μ΄ λ°μν μ μμΌλ μ£Όμν΄μΌ ν©λλ€.
PHANTOM READ λΆμ ν©μ λ°©μ§νκΈ° μν΄μλ λ½(lock) κΈ°λ₯μ μ¬μ©ν΄μΌ νλ©° InnoDBμμλ κ° λ½κ³Ό λ₯μ€νΈ ν€ λ½ λλΆμ REPEATABLE READ 격리 μμ€μμλ PHANTOM READ λΆμ ν©μ λ°©μ§ν μ μμ΅λλ€.
νΈλμμ μ 무μ λ°λ₯Έ SELECTμ μ°¨μ΄
"νΈλμμ
λ΄μμ" μ€νλλ SELECTμ "νΈλμμ
μμ΄" μ€νλλ SELECTλ READ COMMITTED 격리 μμ€μμλ μ°¨μ΄κ° λ³λ‘ μμ΅λλ€. νμ§λ§ REPEATABLE READμμλ κΈ°λ³Έμ μΈ SELECT 쿼리 λ¬Έμ₯λ νΈλμμ
λ²μ λ΄μμλ§ μλν©λλ€.
μ¦, νΈλμμ
μ ν λ² μμνμΌλ©΄ κ·Έ νΈλμμ
μμλ SELECT μ λμΌν κ²°κ³Όλ§ λ³΄κ² λλ―λ‘ λμ΄ μ€κ°λ μꡬμ¬ν λ± μ 체μ μΌλ‘ λ΄€μ λ λ°μ΄ν°μ μ ν©μ±μ΄ μ€μν κ²½μ°λ μνν μ μμΌλ μ΄ μ°¨μ΄λ₯Ό μ μ΄ν΄νκ³ μμ΄μΌ ν©λλ€.
μ΄λ° λ¬Έμ λ‘ λ°μ΄ν°μ μ ν©μ±μ΄ κΉ¨μ§κ³ μ ν리μΌμ΄μ μμ λ²κ·Έκ° λ°μνλ©΄ μ°Ύμλ΄κΈ° μ½μ§ μμΌλ μ£Όμν΄μΌ ν©λλ€.
SERIALIZABLE
μ½κΈ° μμ
λ 곡μ μ κΈμ νλν΄μΌλ§ νλ κ°μ₯ λ¨μνλ©΄μ κ°μ₯ μ
격ν 격리 μμ€μ
λλ€.
SERIALIZABLE 격리 μμ€μ μ κΈμ μ΄μ©ν΄ λ°μ΄ν°μ μΌκ΄μ±μ 보μ₯ν©λλ€. νμ§λ§ μ΄μ λ°λΌ λμ μ²λ¦¬ μ±λ₯μ λ€λ₯Έ νΈλμμ
격리 μμ€λ³΄λ€ λ¨μ΄μ§κ² λ©λλ€.
SERIALIZABLEμμλ PHANTOM READ λΆμ ν©μ΄ λ°μνμ§ μμ΅λλ€.
κ·Έλ¬λ μ REPEATABLE READμμ μμλ΄€λ―μ΄ InnoDBμμλ κ° λ½κ³Ό λ₯μ€νΈ ν€ λ½ λλΆμ REPEATABLE READ 격리 μμ€μμλ PHANTOM READ λΆμ ν©μ λ°©μ§ν μ μμΌλ―λ‘ SERIALIZABLEμ κ΅³μ΄ μ¬μ©ν νμμ±μ μμ΅λλ€.
격리 μμ€κ³Ό λ°μ΄ν° λΆμ ν© μ 리
격리 μμ€κ³Ό μΌμ΄λ μ μλ λ°μ΄ν° λΆμ ν©μ νλ‘ μ 리νλ©΄ λ€μκ³Ό κ°μ΅λλ€.
'BackEnd' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ°λ¦¬ μλ²μ OOMKilled μ₯μ κ° λ°μνμ΄μ - νκ³ νΈ (0) | 2024.11.10 |
---|---|
MySQL μ€ν κ³ν νΊμ보기 (1) | 2024.04.28 |
AWS Elastic Beanstalk λ¨μΌ μΈμ€ν΄μ€ 무μ€λ¨ λ°°ν¬νκΈ° (0) | 2023.10.08 |
μμ¦ λ μ€λ₯΄λ gRPC νΊμ보기 (2) | 2022.12.04 |
Nginx 403 (13 Permission denied) ν΄κ²°νκΈ° (0) | 2021.10.30 |
- Total
- Today
- Yesterday
- λ± ν¬μλ¬λ κ°λ°μ
- κΉμ΄/λλΉ μ°μ νμ(DFS/BFS)
- νλ‘κ·Έλλ¨Έμ€
- μ’μ μμ§λμ΄
- HTTP
- μΆμ μ§λ
- μκ³ λ¦¬μ¦
- Golang
- λ°±μ€
- μ½λ©ν μ€νΈ
- golang oomkilled
- mysql
- μ’μ κ°λ°μ
- μ€ν/ν
- μ’μ μ½λλ 무μμΈκ°?
- Aws Reinvent 2023
- kotlin s3 upload
- μ’μ κ°λ°μ λκΈ°
- mysql μ€ν κ³ν
- 2023 κ°λ°μ νκ³
- νΈλμμ 격리 μμ€
- 2λ μ°¨ μλ² κ°λ°μ
- 2023 νκ³
- Go
- μ₯μ νκ³
- rate limit
- ν(Heap)
- AWS re:Invent 2023
- grpc client
- ν΄μ
μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |