day69 πŸŒ•

μž₯λ―ΈΒ·2022λ…„ 8μ›” 22일
0

였늘의 μ„±κ³Ό

λͺ©λ‘ 보기
69/129

μŠ€ν”„λ§ DB 1편 - 데이터 μ ‘κ·Ό 핡심 원리 μ„Ήμ…˜ 3 μˆ˜κ°•

+) 22. 09. 03. 정리 μΆ”κ°€!

μ„Ήμ…˜ 3. νŠΈλžœμž­μ…˜ 이해 μˆ˜κ°• μ™„λ£Œ!!

νŠΈλžœμž­μ…˜ κ°œλ… 이해

데이터λ₯Ό μ €μž₯ν•  λ•Œ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒ?
μ—¬λŸ¬ 가지 μ΄μœ κ°€ μžˆμ§€λ§Œ, λ°μ΄ν„°λ² μ΄μŠ€λŠ” νŠΈλžœμž­μ…˜μ΄λž€ κ°œλ…μ„ μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ νŠΈλžœμž­μ…˜μ€ ν•˜λ‚˜μ˜ 거래λ₯Ό μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•˜λ„λ‘ 보μž₯ν•΄ μ£ΌλŠ” 것을 λœ»ν•œλ‹€.

예: A의 5000원을 Bμ—κ²Œ κ³„μ’Œ 이체할 경우

  1. A의 μž”κ³ λ₯Ό 5000원 κ°μ†Œ
  2. B의 μž”κ³ λ₯Ό 5000원 증가

κ³„μ’Œ 이체 κ±°λž˜λŠ” μœ„μ™€ 같이 두 가지 μž‘μ—…μ΄ ν•©μ³μ Έμ„œ ν•˜λ‚˜μ˜ μž‘μ—…μ²˜λŸΌ λ™μž‘ν•΄μ•Ό ν•œλ‹€.
λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ œκ³΅ν•˜λŠ” νŠΈλžœμž­μ…˜ κΈ°λŠ₯을 μ‚¬μš©ν•˜λ©΄ 1, 2 λ‘˜ λ‹€ ν•¨κ»˜ 성곡해야 ν•œλ‹€. λ§Œμ•½ 쀑간에 ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•œλ‹€λ©΄ 거래 μ „μ˜ μƒνƒœλ‘œ λŒμ•„κ°ˆ 수 μžˆλ‹€.
λͺ¨λ“  μž‘μ—…μ΄ μ„±κ³΅ν•΄μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ— 정상 λ°˜μ˜ν•˜λŠ” 것을 컀밋(commit)이라 ν•˜κ³ , μž‘μ—… 쀑 ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•΄μ„œ 거래 μ΄μ „μœΌλ‘œ λ˜λŒλ¦¬λŠ” 것을 λ‘€λ°±(rollback)이라 ν•œλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° ꡬ쑰와 DB μ„Έμ…˜

λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° ꡬ쑰

λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° ꡬ쑰

μ‚¬μš©μžλŠ” WASλ‚˜ DB μ ‘κ·Ό 툴 같은 ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„μ— μ ‘κ·Όν•  수 μžˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„μ— 연결을 μš”μ²­ν•˜κ³  컀λ„₯μ…˜μ„ 맺게 λœλ‹€.
이 λ•Œ λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„λŠ” 내뢀에 μ„Έμ…˜μ„ λ§Œλ“ λ‹€. ν•΄λ‹Ή 컀λ„₯μ…˜μ„ ν†΅ν•œ λͺ¨λ“  μš”μ²­μ€ 이 μ„Έμ…˜μ„ ν†΅ν•΄μ„œ μ‹€ν–‰ν•œλ‹€.
즉, κ°œλ°œμžκ°€ ν΄λΌμ΄μ–ΈνŠΈλ₯Ό 톡해 SQL을 μ „λ‹¬ν•˜λ©΄ ν˜„μž¬ 컀λ„₯μ…˜μ— μ—°κ²°λœ μ„Έμ…˜μ΄ SQL을 μ‹€ν–‰ν•œλ‹€. μ„Έμ…˜μ€ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•˜κ³ , 컀밋 λ˜λŠ” 둀백을 톡해 νŠΈλžœμž­μ…˜μ„ μ’…λ£Œν•œλ‹€.

νŠΈλžœμž­μ…˜ μ‚¬μš©λ²•

데이터 λ³€κ²½ 쿼리λ₯Ό μ‹€ν–‰ν•˜κ³  λ°μ΄ν„°λ² μ΄μŠ€μ— κ·Έ κ²°κ³Όλ₯Ό λ°˜μ˜ν•˜λ €λ©΄ commit을 ν˜ΈμΆœν•˜κ³ , κ²°κ³Όλ₯Ό λ°˜μ˜ν•˜κ³  싢지 μ•ŠμœΌλ©΄ rollback을 ν˜ΈμΆœν•˜λ©΄ λœλ‹€.
컀밋을 ν˜ΈμΆœν•˜κΈ° μ „κΉŒμ§€λŠ” 데이터λ₯Ό μž„μ‹œλ‘œ μ €μž₯ν•˜λŠ” 것이닀. λ”°λΌμ„œ ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•œ μ„Έμ…˜(μ‚¬μš©μž)μ—κ²Œλ§Œ λ³€κ²½ 데이터가 보이고 λ‹€λ₯Έ μ„Έμ…˜(μ‚¬μš©μž)μ—κ²ŒλŠ” λ³€κ²½ 데이터가 보이지 μ•ŠλŠ”λ‹€.

μ»€λ°‹ν•˜μ§€ μ•Šμ€ 데이터λ₯Ό λ‹€λ₯Έ κ³³μ—μ„œ μ‘°νšŒν•  수 μžˆλ‹€λ©΄?
μ»€λ°‹ν•˜μ§€ μ•Šμ€ 데이터가 보인닀면, μ„Έμ…˜ 2κ°€ 데이터λ₯Ό μ‘°νšŒν–ˆμ„ λ•Œ μ„Έμ…˜ 1이 μΆ”κ°€(λ³€κ²½)ν•œ 데이터가 보일 것이닀. μ„Έμ…˜ 2λŠ” κ·Έ 데이터λ₯Ό 가지고 μ–΄λ– ν•œ λ‘œμ§μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€. 그런데 μ„Έμ…˜ 1이 둀백을 μˆ˜ν–‰ν•˜λ©΄ ν•΄λ‹Ή λ°μ΄ν„°λŠ” μ‚¬λΌμ§€κ²Œ λœλ‹€. 즉, 데이터 정합성에 큰 λ¬Έμ œκ°€ λ°œμƒν•œλ‹€. λ”°λΌμ„œ 컀밋 μ „μ˜ λ°μ΄ν„°λŠ” λ‹€λ₯Έ μ„Έμ…˜μ—μ„œ 보이지 μ•ŠλŠ”λ‹€.

μžλ™ 컀밋, μˆ˜λ™ 컀밋

μžλ™ 컀밋
μžλ™ μ»€λ°‹μœΌλ‘œ μ„€μ •ν•˜λ©΄ 각 쿼리 μ‹€ν–‰ 직후 μžλ™μœΌλ‘œ 컀밋을 ν˜ΈμΆœν•œλ‹€. μ»€λ°‹μ΄λ‚˜ 둀백을 직접 ν˜ΈμΆœν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” νŽΈλ¦¬ν•¨μ΄ μžˆλ‹€. ν•˜μ§€λ§Œ 쿼리λ₯Ό μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ μžλ™μœΌλ‘œ 컀밋이 λ˜μ–΄λ²„λ¦¬κΈ° λ•Œλ¬Έμ— μš°λ¦¬κ°€ μ›ν•˜λŠ” νŠΈλžœμž­μ…˜ κΈ°λŠ₯을 μ œλŒ€λ‘œ μ‚¬μš©ν•  수 μ—†λ‹€.

μžλ™ 컀밋 μ„€μ •

set autocommit true; //μžλ™ 컀밋 λͺ¨λ“œ μ„€μ •
insert into member(member_id, money) values ('data1', 10000); // μžλ™ 컀밋
insert into member(member_id, money) values ('data2', 10000); // μžλ™ 컀밋

μˆ˜λ™ 컀밋 μ„€μ •

set autocommit false; //μˆ˜λ™ 컀밋 λͺ¨λ“œ μ„€μ •
insert into member(member_id, money) values ('data3', 10000);
insert into member(member_id, money) values ('data4', 10000);
commit; //μˆ˜λ™ 컀밋

보톡 μžλ™ 컀밋 λͺ¨λ“œκ°€ 기본으둜 μ„€μ •λœ κ²½μš°κ°€ 많기 λ•Œλ¬Έμ—, μˆ˜λ™ 컀밋 λͺ¨λ“œλ‘œ μ„€μ •ν•˜λŠ” 것을 νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•œλ‹€κ³  ν‘œν˜„ν•  수 μžˆλ‹€.
μˆ˜λ™ 컀밋 λͺ¨λ“œλ‚˜ μžλ™ 컀밋 λͺ¨λ“œλŠ” ν•œ 번 μ„€μ •ν•˜λ©΄ ν•΄λ‹Ή μ„Έμ…˜μ—μ„œλŠ” 계속 μœ μ§€λœλ‹€.

μ‹ κ·œ 데이터 μΆ”κ°€ - 컀밋 μ „

μ„Έμ…˜ 1 μ‹ κ·œ 데이터 μΆ”κ°€

μ„Έμ…˜ 1 μ‹ κ·œ 데이터 μΆ”κ°€

μ„Έμ…˜ 1 쑰회 κ²°κ³Ό

μ„Έμ…˜ 1 쑰회 κ²°κ³Ό

μ„Έμ…˜ 2 쑰회 κ²°κ³Ό

μ„Έμ…˜ 2 쑰회 κ²°κ³Ό

아직 μ„Έμ…˜ 1이 컀밋을 ν•˜μ§€ μ•Šμ€ μƒνƒœκΈ° λ•Œλ¬Έμ— μ„Έμ…˜ 1μ—μ„œλŠ” μž…λ ₯ν•œ 데이터가 λ³΄μ΄μ§€λ§Œ, μ„Έμ…˜ 2μ—μ„œλŠ” μž…λ ₯ν•œ 데이터가 보이지 μ•ŠλŠ” 것을 확인할 수 μžˆλ‹€.

μ„Έμ…˜ 1 μ‹ κ·œ 데이터 μΆ”κ°€ ν›„ commit

μ„Έμ…˜1 μ‹ κ·œ 데이터 μΆ”κ°€ ν›„ commit

μ„Έμ…˜ 1 μ‹ κ·œ 데이터 μΆ”κ°€ ν›„ commit

컀밋 ν›„ μ„Έμ…˜ 2 쑰회 κ²°κ³Ό

컀밋 ν›„ μ„Έμ…˜ 2 쑰회 κ²°κ³Ό

μ„Έμ…˜ 1이 νŠΈλžœμž­μ…˜μ„ μ»€λ°‹ν–ˆκΈ° λ•Œλ¬Έμ— λ°μ΄ν„°λ² μ΄μŠ€μ— μ‹€μ œ 데이터가 λ°˜μ˜λœλ‹€. 컀밋 μ΄ν›„μ—λŠ” λͺ¨λ“  μ„Έμ…˜μ—μ„œ 데이터λ₯Ό μ‘°νšŒν•  수 μžˆλ‹€.

DB 락 κ°œλ… 이해

μ„Έμ…˜ 1이 νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•˜κ³  데이터λ₯Ό μˆ˜μ •ν•˜λŠ” λ™μ•ˆ 아직 컀밋을 μˆ˜ν–‰ν•˜μ§€ μ•Šμ•˜λŠ”λ°, μ„Έμ…˜ 2μ—μ„œ λ™μ‹œμ— 같은 데이터λ₯Ό μˆ˜μ •ν•˜κ²Œ 되면 μ—¬λŸ¬ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€. νŠΈλžœμž­μ…˜μ˜ μ›μžμ„±μ΄ κΉ¨μ§€λŠ” 것이닀.

이런 문제λ₯Ό λ°©μ§€ν•˜λ €λ©΄ μ„Έμ…˜μ΄ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•˜κ³  데이터λ₯Ό μˆ˜μ •ν•˜λŠ” λ™μ•ˆμ—λŠ” μ»€λ°‹μ΄λ‚˜ λ‘€λ°± μ „κΉŒμ§€ λ‹€λ₯Έ μ„Έμ…˜μ—μ„œ ν•΄λ‹Ή 데이터λ₯Ό μˆ˜μ •ν•  수 없도둝 ν•΄μ•Ό ν•œλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€λŠ” 이런 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 락(Lock)μ΄λΌλŠ” κ°œλ…μ„ μ œκ³΅ν•œλ‹€.

  1. μ„Έμ…˜ 1이 νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•œλ‹€.
  2. μ„Έμ…˜ 1이 newId의 moneyλ₯Ό 500으둜 변경을 μ‹œλ„ν•œλ‹€. 이 λ•Œ ν•΄λ‹Ή 둜우의 락을 λ¨Όμ € νšλ“ν•΄μ•Ό ν•œλ‹€. 락이 남아 μžˆμœΌλ―€λ‘œ μ„Έμ…˜ 1은 락을 νšλ“ν•œλ‹€.
  3. μ„Έμ…˜ 1은 락을 νšλ“ν–ˆμœΌλ―€λ‘œ ν•΄λ‹Ή λ‘œμš°μ— update sql을 μˆ˜ν–‰ν•œλ‹€.
  4. μ„Έμ…˜ 2κ°€ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•œλ‹€.
  5. μ„Έμ…˜ 2도 newId의 moneyλ₯Ό λ³€κ²½ν•˜λ €κ³  ν•œλ‹€. ν•˜μ§€λ§Œ 락이 μ—†μœΌλ―€λ‘œ 락이 λŒμ•„μ˜¬ λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦°λ‹€. (락 λŒ€κΈ° μ‹œκ°„μ„ λ„˜μ–΄κ°€λ©΄ 락 νƒ€μž„μ•„μ›ƒ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.)
  6. μ„Έμ…˜ 1이 컀밋을 μˆ˜ν–‰ν•œλ‹€. νŠΈλžœμž­μ…˜μ΄ μ’…λ£Œλ˜μ—ˆμœΌλ―€λ‘œ 락을 λ°˜λ‚©ν•œλ‹€.
  7. μ„Έμ…˜ 2κ°€ 락을 νšλ“ν•œ ν›„ update sql을 μˆ˜ν–‰ν•œλ‹€.
  8. μ„Έμ…˜ 2κ°€ 컀밋을 μˆ˜ν–‰ν•œ ν›„ νŠΈλžœμž­μ…˜μ΄ μ’…λ£Œλ˜μ—ˆμœΌλ―€λ‘œ 락을 λ°˜λ‚©ν•œλ‹€.

DB 락 - 쑰회

일반적인 μ‘°νšŒλŠ” 락을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
보톡 데이터λ₯Ό μ‘°νšŒν•  λ•ŒλŠ” 락을 νšλ“ν•˜μ§€ μ•Šκ³  λ°”λ‘œ 데이터λ₯Ό μ‘°νšŒν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, μ„Έμ…˜ 1이 락을 νšλ“ν•˜κ³  데이터λ₯Ό λ³€κ²½ν•˜κ³  μžˆμ–΄λ„ μ„Έμ…˜ 2μ—μ„œ 데이터λ₯Ό μ‘°νšŒν•  수 μžˆλ‹€.

μ‘°νšŒμ™€ 락
데이터λ₯Ό μ‘°νšŒν•  λ•Œλ„ 락을 μ–»κ³  μ‹Άλ‹€λ©΄ select for update ꡬ문을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

쑰회 μ‹œμ μ— 락이 ν•„μš”ν•œ κ²½μš°λŠ”?
νŠΈλžœμž­μ…˜ μ’…λ£Œ μ‹œμ κΉŒμ§€ ν•΄λ‹Ή 데이터λ₯Ό λ‹€λ₯Έ κ³³μ—μ„œ λ³€κ²½ν•˜μ§€ λͺ»ν•˜λ„둝 κ°•μ œλ‘œ 막아야 ν•  λ•Œ μ‚¬μš©ν•œλ‹€.


ν† ν”½ 1개


κ°•μ˜, ν† ν”½ λ²¨λ‘œκ·Έμ— 정리


μ½”ν…Œ 1문제

profile
김뉴비

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보