λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”¬μ•„ν‚€ν…μ²˜/- Database

[λ°μ΄ν„°λ² μ΄μŠ€] Isolation Level, 고립 μˆ˜μ€€

by Wonit 2021. 4. 7.

Isolation Level, 고립 μˆ˜μ€€μ— λŒ€ν•΄μ„œ μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” Transaction, νŠΈλžœμž­μ…˜ 에 λŒ€ν•œ 이해가 ν•„μš”ν•˜λ‹€.
λ§Œμ•½ νŠΈλžœμž­μ…˜μ— λŒ€ν•΄μ„œ ν™•μ‹€ν•˜κ²Œ 이해λ₯Ό ν•˜μ§€ λͺ» ν–ˆλ‹€λ©΄, ν™•μΈν•˜κ³  μ˜€λŠ” 것을 μΆ”μ²œν•œλ‹€!

 

Isolation Level, 고립 μˆ˜μ€€

좜처 : https://medium.com/@huynhquangthao

 

Isolation Level, 고립 μˆ˜μ€€μ€ νŠΈλžœμž­μ…˜λ“€ 끼리 μΌκ΄€λœ 데이터λ₯Ό μ–Όλ§ˆλ‚˜ ν—ˆμš©ν•  것인지λ₯Ό μ •ν•˜λŠ” μˆ˜μ€€μ΄λ‹€.

 

고립 μˆ˜μ€€μ—λŠ” 총 4κ°€μ§€μ˜ μˆ˜μ€€, 3단계가 μ‘΄μž¬ν•œλ‹€ (0단계 λΆ€ν„° μ‹œμž‘)

  1. Level 0 Read Uncommitted
  2. Level 1 Read Committed
  3. Level 2 Repeatable Read
  4. Level 3 Serializable

이런 고립 μˆ˜μ€€μ—λŠ” λ‚˜λ¦„μ˜ νŠΉμ§•μ΄ μžˆλ‹€.

이제 각각의 μˆ˜μ€€μ— λ”°λΌμ„œ μ•Œμ•„λ³΄μž.

Isolation Level, 고립 레벨

Level 0. Read Uncommitted

Read UncommittedλŠ” Uncommitted 된 κ²°κ³Όλ₯Ό 확인할 수 μžˆλ‹€.

 

κ·Έλ ‡κ²Œ 되면 λ°μ΄ν„°λ² μ΄μŠ€ 결과의 일관성을 μœ μ§€ν•˜κΈ° νž˜λ“€λ‹€λŠ” 단점이 μ‘΄μž¬ν•˜μ§€λ§Œ λ™μ‹œ λ™μ‹œμ„±μ€ ν–₯μƒλœλ‹€.

transaction 1 이 μˆ˜ν–‰ 쀑에 transaction 2 κ°€ 값을 λ³€κ²½ν•  수 μžˆλŠ”λ°, transaction1 은 λ³€κ²½λ˜κΈ° μ „μ˜ 값을 읽기 λ•Œλ¬Έμ— μ΅œλŒ€ν•œ μ‚¬μš©ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€. 이λ₯Ό Dirty Read 라고 ν•œλ‹€.

λ°œμƒλ  수 μžˆλŠ” 이상 ν˜„μƒ

  • Dirty Read : Uncommitted κ²°κ³Όλ₯Ό ν™•μΈν•˜λŠ” 경우
  • Non Repeatable Read : λ™μΌν•œ 쿼리λ₯Ό 2번 μ‹€ν–‰ν•  λ•Œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μˆ˜μ •/μ‚­μ œν•˜λŠ” 경우
  • Phantom Read : λ™μΌν•œ 쿼리λ₯Ό 2번 μ‹€ν–‰ν•  λ•Œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μ—…λ°μ΄νŠΈν•˜λŠ” 경우

Level 1. Read Committed

Read CommittedλŠ” νŠΈλžœμž­μ…˜μ΄ μž‘μ—…ν•˜λŠ” μ‹œμ μ— Lock을 건닀.


이 Lock 을 κ±°λŠ” μ£Όμ²΄λŠ” INSERT λ‚˜ UPDATE 와 같은 처리 μ„Έμ…˜μΈλ°, μ΄λ ‡κ²Œ ν•˜λ©΄ μΏΌλ¦¬ν•˜λŠ” μ„Έμ…˜(SELECT) 은 INSERTλ‚˜ UPDATEκ°€ 되기 κΉŒμ§€ 기닀리기 λ•Œλ¬Έμ— Dirty Read λ₯Ό ν”Όν•  수 μžˆλ‹€.

λŒ€λΆ€λΆ„μ˜ DBMS 의 기본적인 Isolation Level이닀. MySql 은 ν•΄λ‹Ήλ˜μ§€ μ•ŠλŠ”λ‹€.

  • Lock 을 κ±°λŠ” 주체 : μ²˜λ¦¬ν•˜λŠ” μ„Έμ…˜ (INSERT, UPDATE)
  • μΏΌλ¦¬ν•˜λŠ” μ„Έμ…˜(SELECT) 이 λŒ€κΈ°

λ°œμƒλ  수 μžˆλŠ” 이상 ν˜„μƒ

  • Non Repeatable Read : λ™μΌν•œ 쿼리λ₯Ό 2번 μ‹€ν–‰ν•  λ•Œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μˆ˜μ •/μ‚­μ œν•˜λŠ” 경우
  • Phantom Read : λ™μΌν•œ 쿼리λ₯Ό 2번 μ‹€ν–‰ν•  λ•Œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μ—…λ°μ΄νŠΈν•˜λŠ” 경우

Level 2. Repeatable Read

Repeatable ReadλŠ” Read Committed 와 λ§ˆμ°¬κ°€μ§€λ‘œ νŠΈλžœμž­μ…˜μ΄ μž‘μ—…ν•˜λŠ” μ‹œμ μ— Lock을 건닀.


ν•˜μ§€λ§Œ λ‹€λ₯Έ 점은 Lock을 κ±°λŠ” 주체이닀.


Repeatable ReadλŠ” μΏΌλ¦¬ν•˜λŠ” μ„Έμ…˜μ΄ 락을 κ±ΈκΈ° λ•Œλ¬Έμ— Non Repeatable Read λ₯Ό νšŒν”Όν•  수 있게 λœλ‹€.

MySql 의 Default Isolation Level이닀.

  • Lock 을 κ±°λŠ” 주체 : μΏΌλ¦¬ν•˜λŠ” μ„Έμ…˜ (SELECT)
  • μ²˜λ¦¬ν•˜λŠ” μ„Έμ…˜ (INSERT, UPDATE)이 λŒ€κΈ°

이상 ν˜„μƒ λ°œμƒ κ°€λŠ₯

  • Phantom Read : λ™μΌν•œ 쿼리λ₯Ό 2번 μ‹€ν–‰ν•  λ•Œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μ—…λ°μ΄νŠΈν•˜λŠ” 경우

Level 3. Serializable

Serializable λŠ” 이름 κ·ΈλŒ€λ‘œ 직렬화 μ „λž΅μ΄λ‹€. λͺ¨λ“  λ™μž‘μ΄ 직렬화 ν•˜κ²Œ μž‘λ™ν•œλ‹€.
μ΅œμƒμœ„ Isolation Level이닀.

λ°μ΄ν„°μ˜ μ•ˆμ •μ„±μ΄ 맀우 μ€‘μš”ν•œ νŠΉμˆ˜ν•œ 상황이 μ•„λ‹Œ 이상 거의 μ‚¬μš©ν•˜μ§€ μ•ŠμŒ

λ°œμƒν•  수 μžˆλŠ” μ΄μƒν˜„μƒ

μ—†λ‹€.

Isolation Level 이 ν—ˆμš©ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ 이상 ν˜„μƒ

Isolation Level Dirty Read Non-Repeatable Read Phantom Read
Level 0, Read Uncommitted ν—ˆμš© ν—ˆμš© ν—ˆμš©
Level 1, Read Committed x ν—ˆμš© ν—ˆμš©
Level 2, Repeatable Read x x ν—ˆμš©
Level 3, Serializable x x x

λŒ“κΈ€