MySQL 격리 μμ€
νΈλμμ 격리 μμ€(Isolation Level)μ΄λ μ¬λ¬ νΈλμμ μ΄ λμμ μ²λ¦¬λ λ νΉμ νΈλμμ μ΄ λ€λ₯Έ νΈλμμ μμ λ³κ²½νκ±°λ μ‘°ννλ λ°μ΄ν°λ₯Ό λ³Ό μ μκ² νμ©ν μ§ λ§μ§λ₯Ό κ²°μ νλ κ²μ΄λ€.
βDirty ReadβλΌκ³ λ νλ Read Uncommittedλ κ±°μ μ¬μ©νμ§ μκ³ , Serializable λν λμμ±μ΄ μ€μν DBμμλ κ±°μ μ¬μ©λμ§ μλλ€.
4κ°μ 격리 μμ€μμ μμλλ‘ λ€λ‘ κ°μλ‘ νΈλμμ κ° λ°μ΄ν° 격리(κ³ λ¦½) μ λκ° λμμ§λ©° λμμ±λ λ¨μ΄μ§λ€.
격리 μμ€μ΄ λμμ§μλ‘ MySQL μλ²μ μ²λ¦¬ μ±λ₯μ΄ λ§μ΄ λ¨μ΄μ§ κ²μΌλ‘ μμνλλ°, Serializableμ΄ μλλΌλ©΄ ν¬κ² κ°μ μ΄λ μ νκ° λ°μνμ§ μλλ€.

SQL-92, SQL-99 νμ€μ λ°λ₯΄λ©΄ Repeatable Readμμλ Phantom Readκ° λ°μν μ μμ§λ§, InnoDBλ λ νΉν νΉμ±μΌλ‘ Repeatable Readμμλ λ°μνμ§ μλλ€.
μΌλ°μ μΈ DBλ Read Committedμ Repeatable Read μ€ νλλ₯Ό μ¬μ©νλ€.
Read Uncommitted

Read Uncommitted 격리 μμ€μμλ κ·Έλ¦Όκ³Ό κ°μ΄ νΈλμμ μμμ λ³κ²½ λ΄μ©μ΄ commit, rollback μ¬λΆ μκ΄μμ΄ λ€λ₯Έ νΈλμμ μμ 보μΈλ€.
μ¬μ©μ A νΈλμμ μμ insertλ₯Ό μννκ³ commit νκΈ° μ μ, μ¬μ©μ Bμμ μ‘°νκ° κ°λ₯νλ€. λ¬Έμ λ μ¬μ©μ A νΈλμμ μμ λ‘€λ°±μ ν΄λ μ¬μ ν μ¬μ©μ B νΈλμμ μμλ βLuraβλ₯Ό μ‘°ννκ³ κ³μ μ²λ¦¬νλ€λ μ μ΄λ€.
μ΄λ κ² μ΄λ€ νΈλμμ
μμ μ²λ¦¬ν μμ
μ΄ μλ£λμ§ μμ μνλ₯Ό λ€λ₯Έ νΈλμμ
μμ λ³Ό μ μλ νμμ λν° λ¦¬λ(Dirty Read)λΌκ³ νλ€.
Read Uncommitted 격리 μμ€μμ λ°μνλ λν° λ¦¬λλ μ ν©μ±μλ λ¬Έμ κ° λ§λ€. κ·Έλμ MySQLμ μ¬μ©νλ€λ©΄ μ΅μν Read Committed μ΄μμ 격리 μμ€ μ¬μ©μ κΆμ₯νλ€.
Read Committed
Read Committedλ Oracle DBMSμμ κΈ°λ³ΈμΌλ‘ μ¬μ©νλ 격리 μμ€μ΄λ©°, μ¨λΌμΈ μλΉμ€μμ κ°μ₯ λ§μ΄ μ νλλ 격리 μμ€μ΄λΌκ³ νλ€. λν° λ¦¬λλ λ°μνμ§ μκ³ μ΄λ€ νΈλμμ
μμ λ°μ΄ν°λ₯Ό λ³κ²½νλλΌλ commitμ΄ μλ£λ λ°μ΄ν°λ§ λ€λ₯Έ νΈλμμ
μμ μ‘°νν μ μκΈ° λλ¬Έμ΄λ€.

μ¬μ©μ A νΈλμμ
μμ λ°μ΄ν°λ₯Ό λ³κ²½νλλ°, μλ‘μ΄ κ°μ ν
μ΄λΈμ μ¦μ κΈ°λ‘λκ³ μ΄μ κ°μ μΈλ μμμΌλ‘ λ°±μ
λλ€. λ°μ΄ν°λ₯Ό λ³κ²½ν νΈλμμ
μμ 컀λ°μ μννκΈ° μ , λ€λ₯Έ νΈλμμ
μμ μ‘°ννλ©΄ μ΄μ κ°μ΄ μ‘°νλλ€.
κ·Έλ¦Όμμ μ¬μ©μ B κ°μ κ²½μ°μλ μλ³Έ ν μ΄λΈμ΄ μλ μΈλ μμμ λ°±μ λ λ μ½λλ₯Ό κ°μ Έμ¨ κ²μ΄λ€.
Read Committed 격리 μμ€μμλ μ΄λ€ νΈλμμ
μμ λ³κ²½ν λ΄μ©μ΄ μ»€λ° λκΈ° μ κΉμ§λ λ€λ₯Έ νΈλμμ
μμ λ³κ²½ λ΄μμ μ‘°νν μ μλ€. μ΄ κ²©λ¦¬ μμ€μμλ βNon-Repeatable ReadβλΌλ λΆμ ν©μ λ¬Έμ κ° μλ€.
μ΄λ λ μ½λκ° λ°λ³΅λμ΄ μ½μ΄μ§λ μν©μμ λ°μνλ λΆμ ν© λ¬Έμ μ΄λ€.

κ·Έλ¦Όμ²λΌ μ¬μ©μ Bκ° νΈλμμ μ μμνκ³ βTotoβμΈ μ¬μ©μλ₯Ό κ²μνλλ° κ²°κ³Όλ μμλ€. νμ§λ§ λ€λ₯Έ νΈλμμ (μ¬μ©μ A)μμ λ°μ΄ν°λ₯Ό λ³κ²½νκ³ μ»€λ° ν, λκ°μ νΈλμμ (μ¬μ©μ B)μμ μ‘°νν κ²°κ³Ό 1κ±΄μ΄ μ‘°νλλ€.
μ΄λ νλμ νΈλμμ
λ΄μμ select queryλ₯Ό μ€ννμ λ, νμ κ°μ κ²°κ³Όλ₯Ό κ°μ ΈμμΌ νλ€λ βRepeateble readβ μ ν©μ±μ μ΄κΈλλ κ²μ΄λ€.
μ΄λ¬ν νμμ βNon-Repeatable Readβ λΌκ³ νλ€.
κΈμ΅ μλΉμ€μμ νλμ νΈλμμ μμ μ /μΆκΈ μ²λ¦¬κ° μ§νλ λ, λ€λ₯Έ νΈλμμ μμ μ‘°νλ₯Ό μ§νν λ select query μ€νλ§λ€ λ€λ₯Έ κ²°κ³Όλ₯Ό κ°μ Έμ¬ μ μλ€.
μ€μν κ²μ μ¬μ© μ€μΈ 격리 μμ€μμ μ€νλλ μΏΌλ¦¬κ° μ΄λ€ κ²°κ³Όλ₯Ό κ°μ Έμ€κ² λλμ§ μμΈ‘ν μ μμ΄μΌ νλ€.
Repeatable Read
Repeatable Readλ MySQL InnoDB Storage Engineμμ κΈ°λ³ΈμΌλ‘ μ¬μ©λλ 격리 μμ€μ΄λ€.
Binary logλ₯Ό κ°μ§ MySQL μλ²μμλ μ΅μ Repeatable Read 격리 μμ€ μ΄μμ μ¬μ©ν΄μΌ νλ€.
μ΄ κ²©λ¦¬ μμ€μμλ βNon-Repeatable Readβ λΆμ ν©μ΄ λ°μλμ§ μλλ€.
InnoDBλ νΈλμμ
μ΄ Rollback λ κ°λ₯μ±μ λλΉν΄ λ³κ²½λκΈ° μ μΈλ(Undo) 곡κ°μ λ°±μ
νκ³ μ€μ λ μ½λ κ°μ λ³κ²½νλ€. μ΄λ¬ν λ³κ²½ λ°©μμ MVCCλΌκ³ νλ©°, Repeatable Read 격리 μμ€μ MVCCλ₯Ό μν΄ μΈλ μμμ λ°±μ
λ μ΄μ λ°μ΄ν°λ₯Ό μ΄μ©ν΄ λμΌ νΈλμμ
λ΄μμλ λμΌν κ²°κ³Όλ₯Ό 보μ¬μ€ μ μκ² λ³΄μ₯νλ€.
Read Committedλ MVCCλ₯Ό μ΄μ©ν΄ commit λκΈ° μ μ λ°μ΄ν°λ₯Ό 보μ¬μ£Όμ§λ§, Repeatable Readμ μ°¨μ΄λ μΈλ μμμ λ°±μ λ λ μ½λμ μ¬λ¬ λ²μ μ€ λͺ λ²μ§Έ μ΄μ λ²μ κΉμ§ μ°Ύμκ°λλμ μλ€.
π₯νΈλμμ λ΄λΆμμ μ€νλλ selectμ μΈλΆμμ μ€νλλ selectμ μ°¨μ΄κ° μλ Read Committedμ λ€λ₯΄κ² Repeatable Read μμμ select queryλ νΈλμμ λ²μ λ΄μμλ§ μ‘΄μ¬νλ€.
Read Committed:
νΈλμμ λ΄/μΈλΆμμ μ€νλλ select query κ²°κ³Όκ° ν¬κ² λ€λ₯΄μ§ μλ€.
κ° select queryλ ν΄λΉ μμ μ μ»€λ° λ λ°μ΄ν°λ§ μ½λλ€.
λμΌν νΈλμμ λ΄μμλ μ¬λ¬ λ²μ select queryλ μλ‘ λ€λ₯Έ κ²°κ³Όλ₯Ό λ°νν μ μλ€.
B νΈλμμ μμ λ λ²μ select queryλ₯Ό μ€νν λ Aμ νΈλμμ μ μ»€λ° μ /ν
Repeatable Read:
select queryλ νΈλμμ μ΄ μμλ μμ μ λ°μ΄ν° μ€λ μ·μ κΈ°μ€μΌλ‘ μ€νλλ€.
νΈλμμ λ΄μμ μ¬λ¬ λ²μ select queryκ° μ€νλμ΄λ νμ κ°μ κ²°κ³Όλ₯Ό λ°ννλ€.
λ€λ₯Έ νΈλμμ μμ λ°μ΄ν°λ₯Ό λ³κ²½νκ³ μ»€λ° ν΄λ, νμ¬ νΈλμμ λ΄μ select query κ²°κ³Όλ λ³νμ§ μλλ€.
λͺ¨λ InnoDBμ νΈλμμ
μ κ³ μ ν transaction_id(μμ°¨μ μΌλ‘ μ¦κ°νλ κ°)μ κ°μ§λ©°, μΈλ μμμ λ°±μ
λ λͺ¨λ λ μ½λμλ λ³κ²½μ λ°μμν¨ transaction_idκ° ν¬ν¨λμ΄ μλ€.
μΈλ μμμ λ°±μ λ λ°μ΄ν°λ InnoDB μμ§μ΄ λΆνμνλ€κ³ νλ¨νλ μμ μ μ£ΌκΈ°μ μΌλ‘ μμ νλ€. MVCCλ₯Ό 보μ₯νκΈ° μν΄ μ€ν μ€μΈ νΈλμμ κ°μ΄λ° κ°μ₯ μ€λλ νΈλμμ λ²νΈλ³΄λ€ νΈλμμ λ²νΈκ° μμ μΈλ μμμ λ°μ΄ν°λ μμ ν μ μλ€. (νμλ‘ μκ°λλ λ μμ trx_idλ₯Ό μμ ν μ μλ€.)

κ·Έλ¦Όμμ ν μ΄λΈμ μ μ₯λ λ μ½λμ trx_idλ 6μ΄λ€.
μ¬μ©μ Bμ νΈλμμ
(id=10)μ΄ λ¨Όμ μμλκ³ , μ€κ°μ μ¬μ©μ Aμ νΈλμμ
(id=12)μ΄ λ°μ΄ν°λ₯Ό λ³κ²½ν΄λ μ¬μ©μ Bμ νΈλμμ
μ select query κ²°κ³Όλ νμ λμΌνλ€.
μ¬μ©μ B νΈλμμ μ μμ λ³΄λ€ μμ νΈλμμ λ²νΈ(10λ³΄λ€ μμ)μ λ³κ²½μ¬νλ§μ λ°λΌλ³Έλ€.
MVCCμ ν΅μ¬ μμΉ μ€, μ€ν μ€μΈ νΈλμμ μ΄ μ΄μ λ²μ μ λ°μ΄ν°λ₯Ό μ½μ΄μΌ ν μ μμ΄μΌ νκΈ° λλ¬Έμ ν΄λΉ νΈλμμ λ³΄λ€ μ€λλ(λ²νΈκ° μμ) λ°μ΄ν°λ 보쑴λμ΄μΌ νλ€.
Repeatable Read 격리 μμ€μμλ Phantom Read λΆμ ν©μ΄ λ°μν μ μλ€.

κ·Έλ¦Όμ²λΌ μ¬μ©μ Bμ νΈλμμ μ΄ λ¨Όμ μ€ννκ³ μ‘°ννλ€. κ·Έλ¦¬κ³ μ¬μ©μ Aμ νΈλμμ μμ λ μ½λλ₯Ό μ½μ νκ³ commit νλ€. κ·Έλ°λ° λ§μ§λ§μ μ¬μ©μ B νΈλμμ μμ μ 체 λ μ½λλ₯Ό μ‘°ννλ©΄ λ μ½λμ μ΄ λ μ½λ κ°―μκ° λ€λ₯΄λ€.
Repeatable Read 격리 μμ€μ΄λΌλ©΄ select qeuryμ κ²°κ³Όκ° λκ°μμΌ νλλ°, λ€λ₯΄κ² λμ¨ κ²μ΄λ€.
μ΄λ κ² λ€λ₯Έ νΈλμμ
μμ μνν λ³κ²½ μμ
μ μν΄ λ μ½λκ° λ³΄μλ€, μ 보μλ€ νλ νμμ βPhantom Read" λΌκ³ νλ€.
select β¦ for update queryλ λ μ½λμ μ°κΈ° μ κΈμ κ±Έμ΄μΌ νλλ°, μΈλ λ μ½λμλ μ κΈμ κ±Έ μ μλ€.
κ·Έλμ select β¦ for updateλ select β¦ lock in share modeλ‘ μ‘°νλλ λ μ½λλ μΈλ μμμ λ³κ²½ μ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ κ²μ΄ μλλΌ νμ¬ λ μ½λμ κ°μ κ°μ Έμ€κ² λλ€.
π€ μμμ νμ΅ν MySQL μ κΈ(Next-Key Lock)μ μνλ©΄ μ κ·Έλ¦Όμ μλͺ»λ κ²μ΄ μλκ°?
λ§λ€. μ¬μ©μ B νΈλμμ μμ select .. where emp_no β₯500000 for update queryκ° μνλλ©΄, emp_no=500000μΈ λ μ½λμ κ·Έ μ΄νμ Gap(500000-INF)μ λν΄μ λ½μ 건λ€. μ¬μ©μ A νΈλμμ μμ μ½μ νλ €λ λ μ½λμ emp_no=500001μ 500000 μ΄νμ κ°μ μμΌλ―λ‘, insertκ° λ§νμΌ νλ€.
κ·Έλμ 격리 μμ€μ νλ₯Ό 보면, Repeatable Readμ ν¬ν 리λλ InnoDBμμ λ°μνμ§ μλλ€. (Next-Key Lock)
Repeatable Readμμλ νΈλμμ μμ μμ μ λ°μ΄ν° μ€λ μ·μ κΈ°μ€μΌλ‘ μΌκ΄λ μ½κΈ°λ₯Ό 보μ₯νμ§λ§, μ΄κ²μ΄ μΈλ λ‘κ·Έλ₯Ό κ³μ μ μ§νλ€λ μλ―Έλ μλλ€.
Serializable
κ°μ₯ μ격ν 격리 μμ€μΌλ‘ λμ μ²λ¦¬ μ±λ₯λ λ€λ₯Έ 격리 μμ€λ³΄λ€ λ¨μ΄μ§λ€.
μ΄ κ²©λ¦¬ μμ€μΌλ‘ μ€μ λλ©΄ μ½κΈ° μμ λ 곡μ μ κΈ(μ½κΈ° μ κΈ)μ νλν΄μΌ νλ©°, λμμ λ€λ₯Έ νΈλμμ μμλ ν΄λΉλλ λ μ½λλ₯Ό λ³κ²½νμ§ λͺ»νλ€.
νλμ νΈλμμ μμ μ½κ³ μ°λ λ μ½λμ λ€λ₯Έ νΈλμμ μμλ μ λ μ κ·Όν μ μλ€.
Serializable 격리 μμ€μμλ μΌλ° DBMSμμ λ°μνλ ν¬ν 리λ λ¬Έμ κ° λ°μνμ§ μλλ€. νμ§λ§ InnoDB μ€ν λ¦¬μ§ μμ§μ μ¬μ©νλ€λ©΄ κ° λ½κ³Ό λ₯μ€νΈ ν€ λ½ λλΆμ Repeatable Readμμλ ν¬ν 리λκ° λ°μνμ§ μκΈ° λλ¬Έμ κ΅³μ΄ Serializableλ₯Ό μ¬μ©ν νμμ±μ μλ€.
Last updated