MySQLμ 격리 μμ€(Isolation Level)
MySQLμ 격리 μμ€
νΈλμμ μ 격리 μμ€(Isolation Level)μ΄λ μ¬λ¬ νΈλμμ μ΄ λμμ μ²λ¦¬λ λ νΉμ νΈλμμ μ΄ λ€λ₯Έ νΈλμμ μμ λ³κ²½νκ±°λ μ‘°ννλ λ°μ΄ν°λ₯Ό λ³Ό μ μκ² νμ©ν μ§ λ§μ§λ₯Ό κ²°μ νλ κ²μ΄λ€.
격리 μμ€μ ν¬κ² 4κ°μ§λ‘ λλλ€.
- Read UNCOMMITTED
- Read COMMITTED
- REPEATABLE READ
- SERIALIZABLE
1λ²λΆν° 4λ²κΉμ§ λ€λ‘ κ°μλ‘ κ° νΈλμμ
κ°μ λ°μ΄ν° 격리(κ³ λ¦½) μ λκ° λμμ§λ©°, λμ μ²λ¦¬ μ±λ₯λ μΌλ°μ μΌλ‘ λ¨μ΄μ§ μ μλ€.
격리 μμ€μ΄ λμμ§μλ‘ MySQL μλ²μ μ²λ¦¬ μ±λ₯μ΄ λ§μ΄ λ¨μ΄μ§ κ²μΌλ‘ μκ°ν μ μμ§λ§, μ¬μ€ SERIALIZABLE μμ€μ΄ μλλΌλ©΄ ν¬κ² μ±λ₯ μ νκ° λ°μνμ§λ μμΌλ μμ¬ν΄λ λλ€.
νλ νΉλ³ν λΆλΆμ΄ μλ€. SQL-92 or 99 νμ€μ λ°λ₯΄λ©΄ REPEATABLE READ 격리 μμ€μμλ PHANTOM READκ° λ°μν μ μλ€.
νμ§λ§, InnoDBλ λ
νΉν νΉμ± λλ¬Έμ REPEATABLE READ 격리 μμ€μμλ PHANTOM READκ° λ°μνμ§ μλλ€.
μΌλ°μ μΈ μ¨λΌμΈ μλΉμ€ μ©λμ DBμμλ READ COMMITTEDμ REPETABLE READ μ€ νλλ₯Ό μ¬μ©νλ€.
ORACLEκ³Ό κ°μ DBMSλ READ COMMITTED μμ€μ λ§μ΄ μ¬μ©νκ³ , MySQLμμλ REPEATABLE READλ₯Ό μ£Όλ‘ μ¬μ©νλ€.
1. READ UNCOMMITTED
κ° νΈλμμ μμμ λ³κ²½ λ΄μ©μ΄ COMMITμ΄λ ROLLBACK μ¬λΆμ μκ΄μμ΄ λ€λ₯Έ νΈλμμ μμ 보μΈλ€.
μ¬μ©μ Aκ° INSERTλ₯Ό μνν ν COMMIT νκΈ°λ μ μ μ¬μ©μ Bκ° ν΄λΉ λ°μ΄ν°λ₯Ό κ²μνλ κ²½μ°, μ΄λ₯Ό λ§μ§ μλλ€.
μ΄ μν©μμ μ¬μ©μ Aκ° μ²λ¦¬ λμ€ μ΄λ ν λ¬Έμ λ‘ μΈν΄ ROLLBACKμ μ§ννλ€λ©΄ μ¬μ ν μ¬μ©μ Bλ μ‘΄μ¬νμ§ μλ λ°μ΄ν°λ₯Ό κ°μ§κ³ μμ
μ μ§νν κ²μ΄λΌλ κ²μ΄λ€.
λ¬Έμ μ
μ΄μ²λΌ μ΄λ€ νΈλμμ
μμ μ²λ¦¬ν μμ
μ΄ μλ£λμ§ μμμμλ λ€λ₯Έ νΈλμμ
μμ λ³Ό μ μλ νμμ Dirty ReadλΌκ³ νλ€.
μ΄λ¬ν λ¬Έμ λλ¬Έμ READ UNCOMMITTEDλ RDBMS νμ€μμλ νΈλμμ
μ 격리 μμ€μΌλ‘ μΈμ νμ§ μμ μ λλ‘ μ ν©μ±μ λ¬Έμ κ° λ§λ€.
MySQLμ μ¬μ©νλ€λ©΄ μ΅μν READ COMMITTED μ΄μμ 격리 μμ€μ μ¬μ©ν κ²!
2. READ COMMITTED
Oracle DBMSμμ κΈ°λ³ΈμΌλ‘ μ¬μ©λλ 격리 μμ€μ΄λ©°, μ¨λΌμΈ μλΉμ€μμ κ°μ₯ λ§μ΄ μ νλλ 격리 μμ€μ΄λ€.
ν΄λΉ 격리 μμ€λΆν°λ Dirty Readμ κ°μ νμμ΄ λ°μνμ§ μλλ€.
μ΄λ ν νΈλμμ
μ΄ λ°μ΄ν°λ₯Ό λ³κ²½νλλΌλ COMMITμ΄ μλ£λ λ°μ΄ν°λ§ λ€λ₯Έ νΈλμμ
μμ μ‘°νν μ μκΈ° λλ¬Έμ΄λ€.
READ COMMITTED 격리 μμ€μμλ μΈλ λ‘κ·Έλ₯Ό μ¬μ©νλ€.
λ°μ΄ν° λ³κ²½μ΄ λ°μνλ©΄ μΈλ λ‘κ·Έ μμμ μ΄μ λ μ½λ μ λ³΄κ° λ°±μ
λλ€. λ°λΌμ μ¬μ©μ Aκ° λ°μ΄ν°λ₯Ό λ³κ²½νκ³ μμ§ COMMITμ΄ λκΈ° μ μ΄λΌλ©΄ μ¬μ©μ Bλ ν
μ΄λΈμ μ‘°ννλ κ²μ΄ μλλΌ μΈλ μμμ λ°±μ
λ λ μ½λλ₯Ό κ°μ Έμ¨λ€.
λ¬Έμ μ
READ COMMITTED 격리 μμ€μμλ NON-REPEATABLE READλΌλ λ μ½λκ° λ°λ³΅λμ΄ μ½μ΄μ§ λ λ°μνλ λ°μ΄ν° λΆμ ν© λ¬Έμ κ° μλ€.
κΈ°λ³Έμ μΌλ‘ νλμ νΈλμμ λ΄μμ λκ°μ SELECT 쿼리λ₯Ό μ€ννμ λ νμ κ°μ κ²°κ³Όλ₯Ό κ°μ ΈμμΌ νλ€λ REPEATABLE READ μ ν©μ±μ λ°λ₯Ό μ μμ΄μΌ νλ€.
νμ§λ§, ν΄λΉ 격리 μμ€μμλ μ¬μ©μ Bκ° λ¨Όμ νΈλμμ μ μμνκ³ μ²μ νΉμ 쑰건μΌλ‘ λ μ½λλ₯Ό κ²μνμ λλ κ²°κ³Όκ° μμμ§λ§ κ·Έ μ¬μ΄μ μ¬μ©μ Aκ° μλ‘μ΄ λ°μ΄ν°λ₯Ό COMMIT νμκ³ , λ€μ μ¬μ©μ Bκ° κ°μ 쑰건μΌλ‘ λ μ½λλ₯Ό κ²μνλ©΄ λ°μ΄ν°κ° 1κ° κ²μλλ λ¬Έμ μΈ κ²μ΄λ€. μ΄λ REPEATABLE READ μ ν©μ±μ μ΄κΈλλ κ²μ΄λ€.
μ΄λ¬ν λΆμ ν© νμμ μΌλ°μ μΈ μν©μμλ λ¬Έμ κ° λμ§ μμ μ μμ§λ§ νλμ νΈλμμ μμ λμΌν λ°μ΄ν°λ₯Ό μ¬λ¬ λ² μ½κ³ λ³κ²½νλ μμ μ΄ κΈμ μ μΌλ‘ κ΄λ ¨λλ©΄ λ¬Έμ κ° λ μ μλ€.
3. REPETABLE READ
ν΄λΉ 격리 μμ€μ MySQLμ InnoDB μ€ν λ¦¬μ§ μμ§μμ κΈ°λ³Έμ μΌλ‘ μ¬μ©λλ€. λ°μ΄λ리 λ‘κ·Έλ₯Ό κ°μ§ MySQL μλ²μμλ μ΅μ REPEATABLE READ 격리 μμ€ μ΄μμ μ¬μ©ν΄μΌ νλ€.
νΈλμμ
λ΄λΆμμ μ€νλλ SELECTμ μΈλΆμμ μ€νλλ SELECTμ μ°¨μ΄κ° μλ READ-COMMITTED 격리 μμ€κ³Όλ λ€λ₯΄κ²,
REPEATABLE READ 격리 μμ€μ κΈ°λ³Έμ μΌλ‘ SELECT 쿼리 λ¬Έμ₯λ νΈλμμ
λ²μ λ΄μμλ§ λμνλ€.
ν΄λΉ 격리 μμ€ λΆν°λ NON-REPEATABLE READ νμμ΄ λ°μνμ§ μλλ€. InnoDB μ€ν λ¦¬μ§ μμ§μ νΈλμμ
μ΄ ROLLBACK λ κ°λ₯μ±μ λλΉν΄ λ³κ²½λκΈ° μ λ μ½λλ₯Ό μΈλ 곡κ°μ λ°±μ
ν΄ λκ³ μ€μ λ μ½λ κ°μ λ³κ²½νλ€.
μ΄λ¬ν λ³κ²½ λ°©μμ MVCC(Multi Version Concurrency Control) μ΄λΌκ³ νλ€.
REPEATABLE READλ MVCCλ₯Ό μν΄ μΈλ μμμ λ°±μ
λ μ΄μ λ°μ΄ν°λ₯Ό μ΄μ©ν΄ λμΌ νΈλμμ
λ΄μμλ λμΌν κ²°κ³Όλ₯Ό 보μ¬μ€ μ μκ² λ³΄μ₯νλ€.
READ_COMMITTED 격리 μμ€ λν MVCCλ₯Ό μ΄μ©ν΄ COMMIT λκΈ° μ μ λ°μ΄ν°λ₯Ό 보μ¬μ£ΌκΈ°λ νλ€. νμ§λ§, μ°¨μ΄λ μΈλ μμμ λ°±μ
λ λ μ½λμ μ¬λ¬ λ²μ κ°μ΄λ° λͺ λ²μ§Έ μ΄μ λ²μ κΉμ§ μ°Ύμ λ€μ΄κ°μΌ νλλμ μλ€.
λͺ¨λ InnoDBμ νΈλμμ μ κ³ μ ν νΈλμμ λ²νΈ(μμ°¨ μ¦κ°)λ₯Ό κ°μ§λ€. μΈλ μμμ λ°±μ λ λͺ¨λ λ μ½λμλ λ³κ²½μ λ°μμν¨ νΈλμμ μ λ²νΈκ° ν¬ν¨λλ€. κ·Έλ¦¬κ³ μΈλ μμμ λ°±μ λ λ°μ΄ν°λ InnoDB μ€ν λ¦¬μ§ μμ§μ΄ λΆνμνλ€κ³ νλ¨λλ μμ μ μ£ΌκΈ°μ μΌλ‘ μμ νλ€.
μ€ν μ€μΈ νΈλμμ μ€μ κ°μ₯ μ€λλ νΈλμμ λ²νΈλ₯Ό κΈ°μ€μΌλ‘ κ·Έλ³΄λ€ μμ νΈλμμ λ²νΈλ₯Ό κ°μ§ μΈλ μμμ νΉμ κ΅¬κ° λ°μ΄ν°λ μμ ν μ μκ³ λ³΄μ‘΄ν΄μΌ νλ€.
μ κ·Έλ¦Ό μμμμ μ¬μ©μ Aμ νΈλμμ λ²νΈλ 12μ΄κ³ , μ¬μ©μ Bλ 10μ΄λ€. μ΄λ μ¬μ©μ Aκ° λ μ½λλ₯Ό λ³κ²½νλ€κ³ νλλΌλ μ¬μ©μ Bλ μμ λ³΄λ€ μμ νΈλμμ λ²νΈ μ¦, 10λ³΄λ€ μμ νΈλμμ λ²νΈλ₯Ό κ°μ§ λ³κ²½μ¬νλ§μ λ³΄κ² λλ€.
λ¬Έμ μ
REPEATABLE READ 격리 μμ€μμλ PHANTOM READ λΆμ ν© νμμ΄ λ°μν μ μλ€.
REPEATABLE READμμλ νλμ νΈλμμ
μμ λ λ²μ SELECT 쿼리μ λν κ²°κ³Όλ λκ°μμΌ νλ€κ³ νλ€.
νμ§λ§ SELECT ... FOR UPDATE 쿼리λ SELECT ... LOCK IN SHARE MODEλ‘ μ‘°νλλ κ²μ κ²°κ³Όκ° λ€λ₯Ό μ μλ€.
SELECT FOR UPDATE 쿼리?
κ°μ₯ λ¨Όμ LOCKμ νλν μΈμ μ κ²μλ λ μ½λλ€μ΄ UPDATE 쿼리 ν COMMIT λκΈ° μ΄μ κΉμ§ λ€λ₯Έ μΈμ λ€μ ν΄λΉ λ μ½λλ€μ μμ νμ§ λͺ»νλλ‘ νλ κΈ°λ₯
κ·Έ μ΄μ λ SELECT ... FOR UPDATE 쿼리μ κ²½μ° SELECT νλ λ μ½λμ μ°κΈ° μ κΈμ κ±Έμ΄μΌ νλλ°, μΈλ λ μ½λμλ μ κΈμ κ±Έ μ μκΈ° λλ¬Έμ΄λ€. λ°λΌμ, μΈλ μμμ λ³κ²½ μ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ κ²μ΄ μλ νμ¬ λ μ½λμ κ°μ κ°μ Έμ€κ² λλ νμμ΄ λ°μνλ€.
μ΄λ κ² λ€λ₯Έ νΈλμμ μμ μνν λ³κ²½ μμ μ μν΄ λ μ½λκ° λ³΄μλ€ μ 보μλ€ νλ νμμ PHANTOM READλΌκ³ νλ€.
β InnoDB μ€ν λ¦¬μ§ μμ§μμλ SELECT FOR UPDATE λλ SELECT FOR SHARE λ± μ κΈμ λλ°ν SELECT 쿼리μμλ PHANTOM READκ° λ°μν μ μμ§λ§, μ΄κ²μ μμΈμ μΈ μν©μ΄λ€. μΌλ°μ μΈ μν©μμλ InnoDB μ€ν λ¦¬μ§ μμ§μ REPEATABLE READ 격리 μμ€μμλ κ° λ½κ³Ό λ₯μ€νΈ ν€ λ½ λλΆμ PHANTOM READκ° λ°μνμ§ μλλ€κ³ νλ€.
4. SERIALIZABLE
ν΄λΉ 격리 μμ€μ κ°μ₯ λ¨μνλ©΄μ λμμ κ°μ₯ μ격νλ€. κ·Έλ§νΌ λμ μ²λ¦¬ μ±λ₯λ λ€λ₯Έ νΈλμμ μ 격리 μμ€λ³΄λ€ λ§μ΄ λ¨μ΄μ§λ€.
InnoDB ν
μ΄λΈμμλ κΈ°λ³Έμ μΌλ‘ μμν SELECT μμ
μ μλ¬΄λ° λ μ½λ μ κΈλ μμ΄ μ€νλλ€.
νμ§λ§ νΈλμμ
격리 μμ€μ΄ SERIALIZABLEλ‘ μ€μ λλ©΄ μ½κΈ° μμ
λ 곡μ μ κΈ(μ½κΈ° μ κΈ)μ νλν΄μΌλ§ νλ©°, λμμ λ€λ₯Έ νΈλμμ
μ κ·Έλ¬ν λ μ½λλ₯Ό λ³κ²½νμ§ λͺ»νκ² λλ€.
ν νΈλμμ μμ μ½κ³ μ°λ λ μ½λλ₯Ό λ€λ₯Έ νΈλμμ μμλ μ λ μ κ·Όν μ μλ κ²μ΄λ€.
SERIALIZABLE 격리 μμ€μμλ μΌλ°μ μΈ DBMSμμ μΌμ΄λλ PHANTOM READ λ¬Έμ κ° λ°μνμ§ μλλ€.
νμ§λ§ InnoDBμμλ REPEATABLE READ 격리 μμ€μμλ PHANTOM READκ° λ°μνμ§ μμΌλ―λ‘ κ΅³μ΄ SERIALIZABLEμ μ¬μ©ν νμμ±μ μλ€