πŸ’Ύ SQL - νŠΈλžœμž­μ…˜

suRanΒ·2022λ…„ 7μ›” 15일
0

πŸ’Ύ MySQL

λͺ©λ‘ 보기
6/9
post-thumbnail

λ³Έ ν¬μŠ€νŒ…μ€ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ λ―Έλ‹ˆ 데브 μ½”μŠ€λ₯Ό κ³΅λΆ€ν•˜λ©°
ν•™μŠ΅μ„ κΈ°λ‘ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ μž‘μ„±λœ κΈ€μž…λ‹ˆλ‹€.

1. νŠΈλžœμž­μ…˜μ΄λž€?

νŠΈλž™μž­μ…˜μ€ μ›μžμ„±μ„ 지킀며 μ‹€ν–‰λ˜μ–΄μ•Όν•˜λŠ” SQL문듀을
ν•˜λ‚˜μ˜ μž‘μ—…μœΌλ‘œ λ¬Άμ–΄ μ²˜λ¦¬ν•˜λŠ” 방법이닀.

μ›μžμ„±μ΄λž€ νŠΈλžœμž­μ…˜μ˜ μ•ˆμ „ν•œ 싀행을 μœ„ν•΄ λ§Œμ‘±ν•΄μ•Όν•˜λŠ”
ACID νŠΉμ„± 쀑 Atomicity에 ν•΄λ‹Ήν•œλ‹€. μ›μžμ„±μ€ νŠΈλžœμž­μ…˜κ³Ό κ΄€λ ¨λœ 일은 λͺ¨λ‘ μ‹€ν–‰λ˜κ±°λ‚˜,
λͺ¨λ‘ μ‹€ν–‰λ˜μ§€ μ•Šμ•„μ•Ό ν•˜λŠ” 것을 보μž₯ν•˜λŠ” νŠΉμ„±μ΄λ‹€.

νŠΈλžœμž­μ…˜μ—μ„œλŠ” νŠΈλžœμž­μ…˜κ³Ό κ΄€λ ¨λœ SQL듀이 닀같이 μ„±κ³΅ν•΄μ•Όν•˜κ³ , λ‹€ 같이 μ‹€νŒ¨ν•΄μ•Όν•œλ‹€.
SQLλ¬Έ 쀑 ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•˜λ©΄ λ‹€μ‹œ νŠΈλžœμž­μ…˜ μ‹€ν–‰ μ „μ˜ μ›μƒνƒœλ‘œ λŒμ•„κ°€μ•Ό ν•œλ‹€.

DML, DDL λͺ…λ Ήμ–΄ μ‚¬μš© 도쀑 ν…Œμ΄λΈ”μ„ μˆ˜μ •ν•˜κ±°λ‚˜ λ ˆμ½”λ“œλ₯Ό μΆ”κ°€ν•˜λŠ” λ“±μ˜ ν…Œμ΄λΈ” 변경사항이 μžˆλŠ” 경우 νŠΈλžœμž­μ…˜μ΄ ν•„μš”ν•  λ•Œκ°€ μžˆλ‹€.

κ·ΈλŸ¬λ‚˜ DML μ€‘μ—μ„œλ„ μ½κΈ°μž‘μ—…λ§Œ ν•˜λŠ” select문을 μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•  μ΄μœ κ°€ μ—†λ‹€.



은행 κ³„μ’Œ μ΄μ²΄λŠ” νŠΈλžœμž­μ…˜μ„ μ„€λͺ…ν•˜κΈ° 쒋은 μ˜ˆμ œμ΄λ‹€.

κ³„μ’Œ μ΄μ²΄λŠ” 인좜과 μž…κΈˆμ˜ 두 κ³Όμ •μœΌλ‘œ 이루어진닀.

A와 BλŠ” κ±°λž˜ν•˜κΈ°λ‘œ ν–ˆλ‹€.
AλŠ” λˆμ„ μž…κΈˆν–ˆκ³ 
BλŠ” κ³„μ’Œλ₯Ό 보며 기닀리고 μžˆλ‹€.
그런데 였λ₯˜λ‘œ 인해
A의 κ³„μ’Œμ—μ„œ 인좜만 이뀄지고
B의 κ³„μ’Œλ‘œ μž…κΈˆλ˜μ§€ μ•Šμ•˜λ‹€.

돈이 휘발된 것이닀.

μœ„μ™€ 같은 일을 λ°œμƒμ‹œν‚€μ§€ μ•ŠκΈ° μœ„ν•΄μ„œ
νŠΈλžœμž­μ…˜μ€ μ „λΆ€ μ„±κ³΅ν•˜κ±°λ‚˜, μ „λΆ€ μ‹€νŒ¨ν•΄μ•Ό ν•œλ‹€.




2. νŠΈλžœμž­μ…˜ 문법

νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•˜λ €λ©΄
SQL문을 BEGINκ³Ό END(COMMIT)으둜 감싼닀.

μ΄λ ‡κ²Œ νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•  경우
END(COMMIT)이 μ‹€ν–‰λ˜κΈ° μ „κΉŒμ§€λŠ”
λ³€κ²½λ‚΄μš©μ΄ DB에 λ°˜μ˜λ˜μ§€ μ•ŠλŠ”λ‹€.

ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ€ COMMIT κ³Ό ROLLBACK을 λ§Œλ‚˜λ©΄ λλ‚œλ‹€.


νŠΈλžœμž­μ…˜ κΈ°λ³Έ 문법

BEGIN;  -- START TRANSACTION 
 A의 κ³„μ’Œμ—μ„œ 인좜
 B의 κ³„μ’Œλ‘œ μž…κΈˆ
END;  -- COMMIT
  • νŠΈλžœμž­μ…˜μ΄ μ„±κ³΅ν•˜λ©΄ μ„±κ³΅μ μœΌλ‘œ COMMIT이 λœλ‹€.
    COMMIT μ „κΉŒμ§€λŠ” μž‘μ—…λ‚΄μ—­μ΄ λ‚˜ μ΄μ™Έμ˜ λ‹€λ₯Έ μ‚¬λžŒλ“€μ—κ²Œ 보이지 μ•ŠλŠ”λ‹€.

  • λ§Œμ•½ BEGIN μ „μ˜ μƒνƒœλ‘œ λŒμ•„κ°€κ³  μ‹Άλ‹€λ©΄ ROLLBACK을 μ‹€ν–‰ν•œλ‹€.

  • κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λŠ” λͺ¨λ‘ νŠΈλžœμž­μ…˜μ„ μ§€μ›ν•œλ‹€. κ·ΈλŸ¬λ‚˜ λ™μž‘μ€
    Autocommitλͺ¨λ“œμ— 따라 달라진닀.






3. commitλͺ¨λ“œ - Autocommit

Autocommit은 μžλ™μœΌλ‘œ COMMIT을 ν•΄μ£ΌλŠ” λͺ¨λ“œμ΄λ‹€.
Autocommit이 κ°€μ§€λŠ” 값은 boolean값이며,
μ–΄λ–€ MySQL ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μ‚¬μš©ν•˜λŠλƒμ— 따라 기본값이 λ‹€λ₯΄λ‹€.
MySQL Workbench의 κ²½μš°μ—λŠ” 기본값이 True값이닀.


autocommit μƒνƒœλ₯Ό μ•Œμ•„λ³΄λŠ” μ½”λ“œ

SHOW VARIABLES LIKE 'AUTOCOMMIT';
  • VALUEκ°€ ON이면 Autocommit값이 true인 μƒνƒœμ΄λ‹€.
  • VALUEκ°€ Off이면 Autocommit값이 false인 μƒνƒœμ΄λ‹€.

πŸ’Ώ Autocommit true

DDL, ν˜Ήμ€ DML μ‚¬μš© μ‹œ μžλ™μœΌλ‘œ COMMIT이 λœλ‹€.
ν…Œμ΄λΈ”μ˜ μˆ˜μ •κ³Ό λ³€κ²½ 사항이 DB에 λ°”λ‘œ μ μš©λœλ‹€.
μ¦‰μ‹œ λ°˜μ˜μ„ ν”Όν•˜κ³  싢을 λ•Œ νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•  λ•Œ
BIGINκ³Ό START TRANSACTION ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜κ³ ,

νŠΈλžœμž­μ…˜μ„ 끝낼 λ•Œ
END와 COMMIT ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

λͺ¨λ“  변경사항은 DB에 λ°”λ‘œ COMMIT되며,
νŠΈλžœμž­μ…˜μ„ ν•˜λŠ” μˆœκ°„μ—λ§Œ μ¦‰μ‹œ 반영이 λ˜μ§€ μ•ŠλŠ”λ‹€.


autocommit 값을 μ„€μ •ν•˜λŠ” μ½”λ“œ

SET autocommit = 1; -- autocommit = 0은 false
  • SET autocommit = 1은 Autocommit값을 true둜 μ„€μ •




πŸ’Ώ Autocommit false

DDL, ν˜Ήμ€ DML μ‚¬μš© μ‹œ 변경사항이 μžλ™μœΌλ‘œ COMMITλ˜μ§€ μ•Šκ³ ,
νƒœμ•„λΈ”μ˜ μˆ˜μ •κ³Ό 변경사항은 λͺ…μ‹œμ μœΌλ‘œ COMMIT을 μ‹€ν–‰ν•΄μ•Ό DB에 λ°˜μ˜λœλ‹€.

λͺ¨λ“  μ“°κΈ°μž‘μ—…μ€ λͺ…μ‹œμ μœΌλ‘œ ROLLBACKμ΄λ‚˜ COMMIT을 ν•΄μ•Ό λ°˜μ˜λœλ‹€.
COMMIT μ΄μ „μ—λŠ” 데이터가 λ³€κ²½λœ κ²ƒμ²˜λŸΌ 보여도 DBμ—λŠ” λ°˜μ˜λ˜μ§€ μ•ŠλŠ”λ‹€.

λͺ¨λ“  것을 λͺ…μ‹œμ μœΌλ‘œ COMMITν•΄μ•Ό λ°˜μ˜λ˜λŠ” ꡬ쑰이기 λ•Œλ¬Έμ— νŠΈλžœμž­μ…˜μ΄λΌλŠ” κ°œλ…μ΄ μ—†λ‹€.
λ”°λΌμ„œ BIGIN 도 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
만일 원 μƒνƒœλ‘œ λŒμ•„κ°€κ³  μ‹Άλ‹€λ©΄ ROLLBACK을 μ‚¬μš©ν•œλ‹€.


autocommit 값을 μ„€μ •ν•˜λŠ” μ½”λ“œ

SET autocommit = 1; -- autocommit = 0은 false
  • SET autocommit = 0은 Autocommit값을 false둜 μ„€μ •





4. νŠΈλžœμž­μ…˜μ—μ„œμ˜ DELETE vs TRUNCATE

πŸ’Ώ DELETE

ν˜•μ‹

DELETE FROM ν…Œμ΄λΈ” 이름;

μž₯점

  • WHEREλ₯Ό μ‚¬μš©ν•œ νŠΉμ • λ ˆμ½”λ“œ μ‚­μ œκ°€ κ°€λŠ₯ν•˜λ‹€.

단점

  • 속도가 λŠλ¦¬λ‹€.



πŸ’Ώ TRUNCATE

ν˜•μ‹

TRUNCATE ν…Œμ΄λΈ” 이름;

μž₯점

  • 전체 ν…Œμ΄λΈ” λ‚΄μš©μ„ μ‚­μ œν•  λ•Œ 속도가 λΉ λ₯΄λ‹€.

단점

  • WHERE을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • TRANSACTION을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.
    즉, νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œTRUNCATEλ₯Ό μ‚¬μš©ν•˜λ©΄ TRUNCATEλŠ” νŠΈλžœμž­μ…˜μ— 상관없이
    ν…Œμ΄λΈ”μ˜ λ‚΄μš©μ„ λͺ¨λ‘ μ‚­μ œν•œλ‹€.



5. 정리

νŠΈλžœμž­μ…˜μ€ μ›μžμ„±μ΄ ν•„μš”ν•œ sql문을 ν•˜λ‚˜μ˜ μž‘μ—…μœΌλ‘œ λ¬Άμ–΄μ„œ μ²˜λ¦¬ν•˜λŠ” 방법이닀.
λ”°λΌμ„œ νŠΈλžœμž­μ…˜μ€ λͺ¨λ‘ μ„±κ³΅ν•˜κ±°λ‚˜, λͺ¨λ‘ μ‹€νŒ¨ν•΄μ•Ό ν•œλ‹€.

νŠΈλžœμž­μ…˜μ΄ μ‹œμž‘ν•  λ•Œ BEGIN(START TRANSACTION)으둜 λ¬Άκ³ 
νŠΈλžœμž­μ…˜μ΄ 끝날 λ•Œ END(COMMIT)으둜 감싼닀.

그런데 TRANSACTIONμ΄λΌλŠ” κ°œλ…μ€ Autocommit true인 μƒνƒœμ—μ„œ 더 μ˜λ―Έκ°€ μžˆλ‹€.
Autocommit false인 μƒνƒœμ—μ„œλŠ” λͺ¨λ“  μ“°κΈ°μž‘μ—…μ΄ λͺ…μ‹œμ μΈ COMMIT ν˜Ήμ€ ROLLBACK을 ν•΄μ•Ό DB에 반영되기 λ•Œλ¬Έμ— BIGIN 도 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

μΆ”κ°€λ‘œ, ν…Œμ΄λΈ”μ˜ μš”μ†Œλ₯Ό μ‚­μ œν•˜λŠ” ν‚€μ›Œλ“œμΈ TRUNCATEλŠ” νŠΈλžœμž­μ…˜μ„ μ§€μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— νŠΈλžœμž­μ…˜ λ‚΄λΆ€μ—μ„œ TRUNCATEλ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ TRUNCATEλŠ” νŠΈλžœμž­μ…˜μ— 관계없이 ν…Œμ΄λΈ”μ˜ λ‚΄μš©μ„ λͺ¨λ‘ μ‚­μ œν•œλ‹€.



profile
개발 곡뢀λ₯Ό 해라

0개의 λŒ“κΈ€