πŸ“š Databases/RealMySQL 8.0

5.1 νŠΈλžœμž­μ…˜

iseunghan 2023. 2. 23. 22:40
λ°˜μ‘ν˜•

νŠΈλžœμž­μ…˜μ˜ μ„±μ§ˆ


Transaction(νŠΈλžœμž­μ…˜)의 4가지 μ„±μ§ˆ (ACID)

  • Atomicity(μ›μžμ„±)
    • all or nothing
    • νŠΈλžœμž­μ…˜μ˜ λͺ¨λ“  연산듀이 정상 μ™„λ£Œλ˜κ±°λ‚˜ μ–΄λ– ν•œ 연산도 μˆ˜ν–‰λ˜μ§€ μ•Šμ€ μƒνƒœλ₯Ό 보μž₯
  • Consistency(일관성)
    • 곡적으둜 μˆ˜ν–‰λœ νŠΈλžœμž­μ…˜μ€ μ •λ‹Ήν•œ 데이터듀이 λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜λ˜μ—ˆμŒμ„ 의미
    • DBμ—μ„œ 데이터 λ³€κ²½ μ‹œ 사전에 μ„€μ •λ˜μ–΄ μžˆλŠ” 룰에 λ§žμ§€ μ•ŠλŠ” 데이터가 λ“€μ–΄κ°€λŠ” 것을 방지
  • Isolation(독립성/고립성)
    • μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ΄ λ™μ‹œμ— μˆ˜ν–‰ λ˜λ”λΌλ„ 각각의 νŠΈλžœμž­μ…˜μ€ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ˜ μˆ˜ν–‰μ— 영ν–₯을 받지 μ•Šκ³  λ…λ¦½μ μœΌλ‘œ μˆ˜ν–‰λ˜μ–΄μ•Ό 함
    • λ‹€μˆ˜μ˜ μ„Έμ…˜ λ˜λŠ” μœ μ €κ°€ 같은 μ‹œκ°„μ— 같은 데이터에 μ ‘κ·Όν•˜κ³  처리 쀑일 λ•Œ μˆ˜ν–‰ 쀑인 νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œ 될 λ•Œ κΉŒμ§€ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ 끼어 듀지 λͺ»ν•˜κ²Œ ν•¨μœΌλ‘œμ¨ λ°μ΄ν„°μ˜ λˆ„λ½μ΄λ‚˜ 잘λͺ»λœ 데이터에 λŒ€ν•œ 방지
  • Durability(지속성)
    • νŠΈλžœμž­μ…˜μ΄ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ–΄ μ»€λ°‹λ˜μ—ˆλ‹€λ©΄, ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ— μ˜ν•œ 반영된 λͺ¨λ“  변경은 ν–₯후에 μ–΄λ–€ μ†Œν”„νŠΈμ›¨μ–΄λ‚˜ ν•˜λ“œμ›¨μ–΄ μž₯μ• κ°€ λ°œμƒ λ˜λ”λΌλ„ λ³΄μ‘΄λ˜μ–΄μ•Ό 함

5.1.1 MySQLμ—μ„œμ˜ νŠΈλžœμž­μ…˜


Transaction(νŠΈλžœμž­μ…˜)

  • μž‘μ—…μ˜ 완전성을 보μž₯ν•΄ μ£ΌλŠ” 것
  • 논리적인 μž‘μ—… 셋을 λͺ¨λ‘ μ™„λ²½ν•˜κ²Œ μ²˜λ¦¬ν•΄μ•Όν•¨
    • μ™„λ²½ν•˜κ²Œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν•œλ‹€λ©΄, 원 μƒνƒœλ‘œ 볡ꡬ해야함
    • μΌλΆ€λ§Œ μ μš©λ˜λŠ” ν˜„μƒ(Partial update)이 λ°œμƒν•˜μ§€ μ•Šμ•„μ•Όν•¨
  • 쿼리의 κ°œμˆ˜μ™€ 관계없이 논리적인 μž‘μ—… μžμ²΄κ°€ 100% λ˜λŠ” 0% μ μš©λ˜μ•Όν•¨
    • 100% : COMMIT μ‹€ν–‰ μ‹œ
    • 0% : ROLLBACK μ‹œ
  • μŠ€ν† λ¦¬μ§€ 엔진에 λ”°λ₯Έ νŠΈλžœμž­μ…˜ 였λ₯˜ μ‹œ, μ‹€ν–‰ κ²°κ³Ό
    • MyISAM : νŠΈλžœμž­μ…˜μ˜ 였λ₯˜μ—λ„ λΆ€λΆ„ μ—…λ°μ΄νŠΈ μ‹€ν–‰ → λ°μ΄ν„° μ •ν•©μ„±(λͺ¨μˆœ 없이 μΌμΉ˜ν•¨) 문제
    • InnoDB : νŠΈλžœμž­μ…˜μ— 일뢀라도 였λ₯˜ μ‹œ, 볡ꡬ
mysql> create table tb_tab_myisam(col int primary key) ENGINE=MyISAM;
mysql> insert into tb_tab_myisam values (3);

mysql> create table tb_tab_innodb(col int primary key) ENGINE=InnoDB;
mysql> insert into tb_tab_innodb values (3);

mysql> insert into tb_tab_myisam values(1),(2),(3);
Error Code: 1062. Duplicate entry '3' for key 'tb_tab_myisam.PRIMARY'

mysql> insert into tb_tab_innodb values(1),(2),(3);
Error Code: 1062. Duplicate entry '3' for key 'tb_tab_innodb.PRIMARY'

-- MyISAM
mysql> select * from tb_tab_myisam;
+-----+
| col |
+-----+
|   1 |
|   2 |
|   3 |
+-----+

-- InnoDB
mysql> select * from tb_tab_innodb;
+-----+
| col |
+-----+
|   3 |
+-----+

5.2.2 μ£Όμ˜μ‚¬ν•­


νŠΈλžœμž­μ…˜μ˜ λ²”μœ„λŠ” μ΅œμ†Œν™”ν•˜λΌ.

  • κΌ­ ν•„μš”ν•œ μ΅œμ†Œμ˜ μ½”λ“œμ—λ§Œ μ μš©ν•˜λŠ” 것이 μ’‹λ‹€.
μ²˜λ¦¬μ‹œμž‘ - > **νŠΈλžœμž­μ…˜ μ‹œμž‘** ->μ‚¬μš©μž 둜그인 μ—¬λΆ€ 확인 -> μ‚¬μš©μž κΈ€μ“°κΈ° λ‚΄μš© 였λ₯˜ μ—¬λΆ€ 확인 -> μ²¨λΆ€λœ 파일의 μ—…λ‘œλ“œ κ°€λŠ₯ ν™•μž₯자 및 μš©λŸ‰ 확인 , μ €μž₯ -> **μ‚¬μš©μž μž…λ ₯ λ‚΄μš©(κΈ€ κ³Ό μ²¨λΆ€νŒŒμΌ 정보) 을 DB에 μ €μž₯** -> μ €μž₯ 된 λ‚΄μš© 쑰회 및 μΆ”κ°€ 정보 DBμ—μ„œ 쑰회 -> κ²Œμ‹œλ¬Όμ— λŒ€ν•œ μ•Œλ¦Ό 메일 λ°œμ†‘ -> **메일 λ°œμ†‘ 이λ ₯ DB에 μ €μž₯** -> **νŠΈλžœμž­μ…˜ μ’…λ£Œ** -> 처리 μ™„λ£Œ
  • νŠΈλžœμž­μ…˜ μ‹œμž‘λΆ€ν„° μ’…λ£ŒκΉŒμ§€ 직접 DB에 μ €μž₯ν•˜λŠ” 행동은 2번 밖에 μ—†μŒ
      1. μ‚¬μš©μž μž…λ ₯ λ‚΄μš© DB μ €μž₯, 2) 메일 λ°œμ†‘ 이λ ₯ DB μ €μž₯
    • μœ„ 2개의 ν–‰λ™μ—λ§Œ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ 및 μ’…λ£Œν•˜λ©΄ 문제λ₯Ό ν”Όν•  수 μžˆλ‹€.
  • μ™ΈλΆ€ 둜직의 문제둜 μž₯μ‹œκ°„ μ†Œμš”λ  경우, μ „체적인 μ²˜λ¦¬κ°€ 맀우 λŠ¦μ–΄μ§€κ±°λ‚˜ 문제 κ°€λŠ₯μ„± λ†’μŒ
    • 특히 ,λ„€νŠΈμ›Œν¬ μž‘μ—…μ΄ μžˆλŠ” 경우 λ°˜λ“œμ‹œ νŠΈλžœμž­μ…˜μ—μ„œ 배제
    • DBMS μ„œλ²„κ°€ 높은 λΆ€ν•˜μƒνƒœλ‘œ λΉ μ§€κ±°λ‚˜ μœ„ν—˜ν•œ μƒνƒœλ‘œ 빠질 κ°€λŠ₯μ„± λ†’μŒ
λ°˜μ‘ν˜•