λ°μ΄ν°λ² μ΄μ€ (mysql) νΈλμμ
β³ μ μ, (λΆκ°μ μ,) νλμ¨μ΄μ μ리, ꡬμ±λ², νΈλμμ
vs νμΌ μμ€ν
μμ
ν λ°μ΄ν°λ² μ΄μ€μ νΈνλλ κΈ°λ₯μΈκ°?
Continue Reading
ACIDκ° λμ§ μμ보기 μ μ γνΈλμμ
γ μ΄ λμ§ μμλ΄μ.
λ°μ΄ν°λ₯Ό λ€λ£¨λ λ
Όλ¦¬μ μΈ μμ
μ λ¨μ μ΄λ€.
DBMSκ° λ°μ΄ν°λ² μ΄μ€λ₯Ό λ€λ£° λ μ¬μ©νλ μμ
(νλ‘κ·Έλ¨) λ¨μ μ΄κΈ°λ
νΈλμμ
μ λ°μ΄ν°λ² μ΄μ€μ 무결μ±μ (μΌκ΄μ±)μ μ μ§νκΈ° μν΄μ μ΄λ€.
+ μ₯μ κ° μΌμ΄λ¬μ λ λ°μ΄ν°λ₯Ό 볡ꡬνλ μμ
μ λ¨μ (λ‘€λ°± λ¨μ)
+ λμμ± μ μ΄ λΈλ‘ λ¨μ (κ°μ λ°μ΄ν°λ₯Ό κ°μ νμ΄λ°μ νμ©ν λ, μλ‘ λΆλ¦¬νλ λ¨μ)
γνλμ¨μ΄μ μ리γ
νλ©΄ νΈλμμ
μ€μλ λ°μ΄ν°λ₯Ό 'μ£ΌκΈ°μ΅μ₯μΉ λ²νΌ' μ¦ 'λ©λͺ¨λ¦¬ λ²νΌ'μ μ μ₯νλ€
(λ©λͺ¨λ¦¬λ νλ°μ±μ΄λ€) μ½μ΄μ¬ λλ λ²νΌμμ μ½μ΄μ¨λ€.
λμ€μ COMMIT;μ λ§λλ©΄
νλλμ€ν¬, SSD μ κ°μ μ€μ§μ 물리μ μ μ₯μ₯μΉμ μ΅μ’
μ μ₯λλ€.
γμ’
λ£ μλ¦Ό ꡬμ±λ² iγ
β β‘ β’ β£ COMMIT β€ β₯
γμ’
λ£ μλ¦Ό ꡬμ±λ² iiγ
β β‘ β’ β£ β€ β₯ COMMIT
*COMMITμ νΈλμμ
μ μ’
λ£λ₯Ό μ리λ SQL λ¬Έμ΄λ€.
(μ°λ¦¬κ° 쿼리λ₯Ό μν ν CLI λ±μμ 'QUERY OK!'λ₯Ό λ°λ κ²μ μ λλΆ)
μ¬μ©μλ₯Ό κ³ λ €νμ¬, λΉ λ₯Έ λ°μμ± μ¦ 'μλ΅μ±'μ 보μ₯νκΈ° μν΄
λ³Έ μ μ₯μ₯μΉ μ μ₯ μ μ, μ¦ 'λ©λͺ¨λ¦¬ λ²νΌ' 'μ£ΌκΈ°μ΅μ₯μΉ λ²νΌ' μμμ μμ
μ΄
λλλ©΄ COMMITμ νμ¬ νΈλμμ
μ μμ μ’
λ£ μ μΈ νκ³
μ€μ λ°μ΄ν°λ² μ΄μ€μ κΈ°λ‘νλ κ²μ DBMSλ‘ νμ¬κΈ μννκ² νλ€.
κ·Έλμ μ€μ λ‘ μλ κ²
β β‘ β’ β£ COMMIT(λΆλΆ μλ£) β€ β₯ μλ£-
μν(β β‘ β’ β£) $ λΆλΆμλ£ $ λ²νΌλ΄μ© κΈ°λ‘(β€ β₯) $ μλ£(COMMIT)
νΈλμμ
컨νΈλ‘€ λκ·μ§
νΈλμμ
μ μ΄ λͺ
λ Ήμ΄λ‘μ, 컀λ°κ³Ό λ‘€λ°±μ΄ μλ€.
κΈ°λ³Έμ μΌλ‘ νΈλμμ
μ€κ°μ μμ
μ΄ μλͺ»λλ©΄ 'ν볡 μκ³ λ¦¬μ¦'μ μ°λλ°
μμμ μΌλ‘ νΈλμμ
μ μ·¨μνλ λͺ
λ Ήμ΄ ROLLBACKμ΄ μ΄λ μ¬μ©λκΈ°λ
λ³κ²½λ λ΄μ©μ μ λΆ μ·¨μνλ€.
+ SAVE (μΈμ΄νν¬μΈνΈ μμ±) (μ¬λ¬ κ° κ°λ₯)
++ AUTO TRANSACTION START
SET TRANSACTION NAME <μ΄λ¦>
OR 'UPDATE'μ κ°μ λ°μ΄ν° λ³κ²½ SQL λ¬Έμ΄ λμ€λ©΄ μλμΌλ‘ μμνλ€
COMMIT λλ ROLLBACK λλ DDL λ¬Έμ λ§λλ©΄ μ’
λ£λλ€. (ν
μ΄λΈ μμ± λ±)
γνΈλμμ
vs νμΌ μμ€ν
μμ
γ
νΈλμμ
: λ²μκΈ°:: DBMS $ μ±μ§:: ACID
νμΌ μμ€ν
μμ
: λ²μκΈ°:: μ»΄νμΌλ¬ $ μ±μ§:: NONE $ μμ
(νλ‘κ·Έλ¨) ꡬ쑰:: main(){ ... } $ νμ©λλ λ°μ΄ν°: νμΌμ μ μ₯λ λ°μ΄ν°
*νμΌ μμ€ν
μ DBMS μμ΄ νμΌ, μ¦ λ°μ΄ν°λ₯Ό μ§μ μ²λ¦¬νλ€.
μμμ±, μΌκ΄μ±, κ³ λ¦½μ±, μ§μμ±
νΈλμμ
μ ν¬ν¨λ μμ
μ μ λΆ μνλκ±°λ μλλ©΄ μ λΆ μνλμ§ μμμΌ νλ€.
μμμ²λΌ λ μ΄μ μͺΌκ°μ§μ§ μλ νλμ νλ‘κ·Έλ¨ λ¨μλ‘ λμν΄μΌ νλ€λ κ².
II. Consistency μΌκ΄μ± (무결μ±)
'λ¬΄κ²°μ± μ μ½μ‘°κ±΄'μ νμ©νμ¬
νΈλμμ
μν μ λ°μ΄ν°μ λ³κ²½μ΄ κ°ν΄μ§ λ
미리 μ μν΄ λ 'λ¬΄κ²°μ± μ μ½μ‘°κ±΄'μ κ²μ¬νμ¬ μΌκ΄μ±μ΄ κΉ¨μ§λ κ±Έ λ§λλ€.
κ·Έλ°λ° λ κ°μ νΈλμμ
μ΄ λμμ μνλ λ νΈλμμ
κ°μ κ°μμΌλ‘
μΌκ΄μ±μ΄ κΉ¨μ§λ νμμ λ¬΄κ²°μ± μ μ½μ‘°κ±΄μ κ²μ¬νλ κ²μΌλ‘ ν΄κ²°ν μ μλ€!
κ·Έλ¬λ―λ‘ λμμ κ°μ λ°μ΄ν°λ₯Ό μ κ·Όνλ νΈλμμ
λ€μ΄ μ§μ μκ² μ κ·Όνμ¬
λ°μ΄ν°λ² μ΄μ€μ μΌκ΄μ±μ μ μ§νλλ‘ νκΈ° μν΄μλ
'λμμ± μ μ΄ μκ³ λ¦¬μ¦'μ μλμμΌμΌ νλ€.
νΈλμμ
μ μννκΈ° μ μ΄λ μνν νλ λ°μ΄ν°λ² μ΄μ€λ νμ μΌκ΄λ μνλ₯Ό μ μ§ν΄μΌ νλ€λ κ². (μ§λ 보쑴μ λ²μΉ)
ν
μ΄λΈμ΄ μμ±λ λ CREATE λ¬Έκ³Ό ALTER λ¬Έμ 'λ¬΄κ²°μ± μ μ½μ‘°κ±΄'μ ν΅ν΄ λͺ
μλλ€. νΈλμμ
μ μ΄ λ¬΄κ²°μ± μ μ½μ‘°κ±΄μ λ°λΌ μΌκ΄μ±μ μ μ§νλ€.
λ€λ§ μν μ€μλ μΌμμ μΌλ‘ μΌκ΄μ±μ μ μ§νμ§ λͺ»νλ μνκ° μμ μ μλ€.
μΌκ΄μ± μλ μν: INCONSISTENT
μν μ€μΈ νΈλμμ
μ λ€λ₯Έ νΈλμμ
μ΄ λΌμ΄λ€μ΄ λ³κ²½ μ€μΈ λ°μ΄ν° κ°μ νΌμνλ μΌμ΄ μμ΄μΌ νλ€. (λ³λ ¬ μΉ¨λ²)
λ°μ΄ν°λ² μ΄μ€λ κΈ°λ³Έμ μΌλ‘ '곡μ 'κ° λͺ©μ μ΄κΈ°μ
μ¬λ¬ νΈλμμ
λ€μ΄ λμμ μνλλ€
μ΄λ κ° νΈλμμ
μ λ³λ ¬μ μΌλ‘ μνλλ λ€λ₯Έ νΈλμμ
μ λ°©ν΄λ₯Ό λ°μ§ μκ³
λ
립μ μΌλ‘ μμ
μ μννλ€.
(μνΈ κ°μ μ΄λ λ°μ΄ν° μΆ©λμ΄ μΌμ΄λμ§ μλ νμ => κ³ λ¦½μ±)
κ³ λ¦½μ±μ μ μ§νκΈ° μν΄μλ λ³κ²½ μ€μΈ μμ λ°μ΄ν°λ₯Ό (in λ©λͺ¨λ¦¬ $ μ£ΌκΈ°μ΅μ₯μΉ)
λ€λ₯Έ νΈλμμ
μμ μ½κ±°λ μ°λ €κ³ ν λ μ μ΄νλ μμ
μ΄ νμνλ€,
=> μ΄κ²λ 'λμμ± μ μ΄ μκ³ λ¦¬μ¦'
κ°μ λ°μ΄ν°λ₯Ό κ°μ§κ³ μΆ©λνμ§ μλλ‘ μ μ΄νλ μμ
!
μνμ μ±κ³΅μ μΌλ‘ μλ£ν νΈλμμ
μ λ³κ²½ν λ°μ΄ν°λ₯Ό μꡬν μ μ₯ν΄μΌ νλ€.
μ μ₯λ λ°μ΄ν°λ² μ΄μ€λ μ μ₯ μ§ν νΉμ μ΄λ λλ λ°μν μ μλ
μ μ , μ₯μ , μ€λ₯ μ μν₯μ λ°μ§ μμμΌ νλ€.
DBMS 볡ꡬ μμ€ν
μ νΈλμμ
μ΄ μμ
ν λ΄μ©μ μμλ‘ log λ‘κ·Έ λ°μ΄ν°λ² μ΄μ€
μ κΈ°λ‘νμλ€κ° λ¬Έμ κ° λ°μνλ©΄, λ‘κ·Έ νμΌμ μ΄μ©νμ¬ λ³΅κ΅¬ μμ
μ μννλ€
μ¦ μμ€ν
μ΄ λ©μΆμ΄λ νΈλμμ
μνμΌλ‘ λ³κ²½λ λ΄μ©μ λμ€ν¬μ κΈ°λ‘λλ€.
μμ -> μν μ€ (active) -> λΆλΆ μλ£ -> λ²νΌ λ΄μ© κΈ°λ‘ -> μλ£
β³ μ€ν¨ -> μμ
μ·¨μ -> μ·¨μ
μμ: BEGIN, λΆλΆ μλ£: PARTIALLY COMMITTED, μ€ν¨: FAILED,
μλ£: COMMITTED, μ·¨μ: ABORTED
μ€ν¨: νΈλμμ
μ μ€κ°μ μ€λ¨νμκ±°λ λΆλΆ μλ£ μνμμ λ³κ²½ λ΄μ©μ
λ°μ΄ν°λ² μ΄μ€μ μ μ₯νμ§ λͺ»ν μνλ₯Ό λ§νλ€.
μ€ν¨ μνμμ DBMSλ νΈλμμ
μ΄ μνν μμ
μ λͺ¨λ μμ볡ꡬμν¨λ€.
γλμμ± μ μ΄ μκ³ λ¦¬μ¦γ
κ°μ λ°μ΄ν°λ₯Ό κ°μ§κ³ μΆ©λνμ§ μλλ‘ μ μ΄νλ μμ
!
λ§μΉ ν νΈλμμ
μ© μμ°¨μ μΌλ‘ μμλλ‘ μ κ·Όνλ κ²μ²λΌ μ μ΄
λ³λ ¬μ±μ κΉ¨λ¨λ¦°λ€.
-> λ³΄λ€ μνλ λ°©λ² γνΈλμμ
κ³ λ¦½ μμ€γ
γν볡 κ΄λ¦¬μ μκ³ λ¦¬μ¦γ
γνΈλμμ
μ μ±μ§κ³Ό κ΄κ³λ DBMSμ κΈ°λ₯γ
C: λ¬΄κ²°μ± μ μ½μ‘°κ±΄(SQL λ¬Έ), λμμ± μ μ΄(LOCKING)
I: λμμ± μ μ΄(λ½νΉ)
D: ν볡 (λ‘κ·Έ λ°λ² )
νΈλμμ
μ΄ λ κ°λΌκ³ νμ. T1 T2
μ½κ³ μ½μ λλ λ¬Έμ μλ€. (λμ μ κ·Όμ νμ©νλ€)
μ½κ³ μΈ λμλ λ¬Έμ κ° λ°μνλ€. 3κ°μ§. (λμ μ κ·Όμ νμ©νκ±°λ κ±°λΆνκ±°λ)
μ€μ μ½κΈ° dirty-read, uncommitted-dependency
λ°λ³΅λΆκ°λ₯ μ½κΈ° non-repeatable-read, inconsistent-analysis
μ λ Ή λ°μ΄ν° μ½κΈ° phantom-read
μ°κ³ μΈ λμλ? μΉλͺ
μ μΈ λ¬Έμ κ° λ°μν μ μμΌλ. (κ±°λΆ. LOCKμ μ΄μ©)
λμμ± μ μ΄λ₯Ό μν κΈ°λ²
λ½μ νΈλμμ
μ΄ λ°μ΄ν°λ₯Ό μ½κ±°λ μμ ν λ λ°μ΄ν°μ νμνλ μ κΈ μ₯μΉλ€
== μμ μ΄ λ°μ΄ν°λ₯Ό μ½λ μ€ λλ μμ μ€ λλ μΆκ° μ€μ΄λΌλ κ±Έ μ리λ μ₯μΉ
LS, LXλ‘ wait λκΈ° μν€κ±°λ UN ν΄μ§νλ€.
shared lock, eXclusive lock, unlock
곡μ λ½ (LS)λ 곡μ λ½μ νμ©νκ³ , λ°°νλ½μ κ±°λΆνλ€.
λ² νλ½ (LX)λ 곡μ λ½μ κ±°λΆνκ³ , λ°°νλ½λ κ±°λΆνλ€.
COMMIT μ νλ©΄ μꡬ μ μ₯λ κ² μλλ€.
[κ·Έλ₯ λ½νΉκ³Ό '2λ¨κ³ λ½νΉ'μ μ°¨μ΄]
νΈλμμ
μ΄ λλ λκΉμ§ λ½μ λμμ£Όμ§ μλλ€. (μΌκ΄μ± 보νΈ)
λ°λλ½ μ¦ κ΅μ°© μνκ° λ°μν μ μλ€.
νμ₯ λ¨κ³ & μμΆ λ¨κ³λ‘ λλλ€.
νμ₯ λ¨κ³: Growing phase, Expanding phase
νΈλμμ
μ΄ νμν λ½μ νλνλ λ¨κ³λ‘,
μ΄ λ¨κ³μμλ νΈλμμ
μ΄ λλκΈ° μ κΉμ§ μ΄λ―Έ νλν λ½μ ν΄μ νμ§ μλλ€.
μμΆ λ¨κ³: Shrinking phase
νΈλμμ
μ΄ λ½μ ν΄μ νλ λ¨κ³λ‘,
μ΄ λ¨κ³μμλ μλ‘μ΄ λ½μ νλνμ§ μλλ€. (λͺ½λ
ν΄μ§, μΈλ½)
[κ΅μ°© μν == λ°λλ½]
μμμ T1μ΄ LX(A), T2κ° LX(B)μ κ°μ Έλ²λ¦¬λ©΄ λ§νλ€.
μ μ μ λκΈ°, HOLD AND WAIT
무ν λκΈ° μνμ λΉ μ§ μ μλ€.
μκ°νλ μ² νμλ€μ μμ¬ μκ°
[λ°λλ½μ ν΄κ²°νλ €λ©΄]
λκΈ° κ·Έλνλ₯Ό κ·Έλ €μ μ¬μ΄ν΄μ΄ μλμ§ νμΈν νμκ° μλ€.
λ½μ΄ 걸리λ λ°μ΄ν° λ²μλ‘
λ½νΉ λ¨μκ° μμμ§λ©΄ λ³νμ± μμ€μ΄ λμμ§λ€.
...λ½νΉ μ€λ²ν€λλ λ½ κ±Έμλ€κ° νμλ€κ°κ° μ€μ΄λλκΉ μ€μ΄λ€κ³
μ½κ³ μ°κΈ° μν©μ κ³ λ €ν μ μλ λ°©λ²μ΄λ€.
μ€μ μ½κΈ° -> λ°°νλ½μ κ±Έμ΄λ 곡μ λ½μ κ±Έμ§ μμ.
(λ€λ₯Έ νΈλμμ
μ 곡μ λ½κ³Ό λ°°νλ½μ΄ κ±Έλ¦° λ°μ΄ν°λ₯Ό μ½μ μ μλ€)
λ‘€λ°±μ κ±Έμ΄λ²λ¦¬λ©΄, λ‘€λ°± κ±ΈκΈ° μ μν μ€μ΄λ λ°μ΄ν°λ§μ μ½μ΄λ²λ¦¬κΈ°μ (λ²νΌ)
μλͺ»λ λ°μ΄ν°λ₯Ό μ½μ΄λ²λ¦¬λ μ
μ΄ λλ€.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
=> 곡μ λ½μ κ±Έμ΄λ²λ¦°λ€. (곡μ λ½ κ±Έλ € μμΌλ©΄ λͺ» λ°κΎΈκ²)
λ°λ³΅λΆκ°λ₯ μ½κΈ° -> 곡μ λ½μ κ±Έμ§λ§ λλλ©΄ νΈλμμ
μ μ λ°λ‘ ν΄μ§νλ€
(λ€λ₯Έ νΈλμμ
μ΄ μ€μ ν 곡μ λ½μ μ½μ§λ§ λ°°νλ½μ μ½μ§ λͺ»νλ€)
νΈλ μ€ μ μ μΆλ ₯ν κ±°λ νμ μΆλ ₯λλ κ² λ¬λΌλ, μ¬μ©μλ λͺ¨λ₯Έλ€ (λμ§)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
=> νΈλμμ
λλ λκΉμ§ λ½ κ±Έμ.
μ λ Ή λ°μ΄ν° μ½κΈ° -> 곡μ λ½μ κ±Έκ³ νΈλμμ
λκΉμ§ μ μ§νλ€
(λ€λ₯Έ νΈλμμ
μ΄ μ€μ ν 곡μ λ½μ μ½μ§λ§ λ°°νλ½μ μ½μ§ λͺ»νλ€)
μμ μ λ°©μ§νλλ°, μΆκ°λ λ°©μ§ λͺ» νλ€.
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
(λ 벨 2) (=2λ¨κ³ λ½νΉ)
=> μΈλ±μ€λ³λ‘ λ½ κ±Έμ. (INSERT κ±°λΆ)
*κ·ΈλΌ κ²°κ΅ μμ°¨μ μΌλ‘, μ§λ ¬νλ κ²κ³Ό κ°μμ§λ€
λ§μ§λ§ λ 벨 -> μΈλ±μ€μ 곡μ λ½μ μ€μ νμ¬
λ€λ₯Έ νΈλμμ
μ INSERT λ¬Έμ΄ κΈμ§λλ€
(SELECT μ§μμ λμμ΄ λλ ν
μ΄λΈμ 미리 λ°°νλ½μ μ€μ ν κ²κ³Ό κ°μ ν¨κ³Ό)
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
MYSQLμ 곡μ λ½μ κ±Έμ§ μκ³ μ΅μ΄ νΈλμμ
SELECT μν μ
SNAPSHOTμ λ§λ ν κ·Έ μ€λ
μ·μΌλ‘ μνν΄ νΈλμμ
μ λ³κ²½ μμλ
λμΌν κ²°κ³Όλ₯Ό μ μ§νλ€ (INSERT λ³ν μμ)