πŸ’Ώ Data/λΆ€νŠΈμΊ ν”„

[TIL]49_Transaction(BEGIN, COMMIT/ROLLBACK)_ACID

Jayden1116 2022. 1. 20. 22:57

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

  • ν†΅μƒμ μœΌλ‘œ μ •λ³΄μ˜ κ΅ν™˜μ΄λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€ κ°±μ‹  λ“± 일련의 μž‘μ—…λ“€μ— λŒ€ν•œ 연속 처리 λ‹¨μœ„λ₯Ό 의미
  • λ°μ΄ν„°λ² μ΄μŠ€μ˜ 무결성이 보μž₯λ˜λŠ” μƒνƒœμ—μ„œ μš”μ²­λœ μž‘μ—…μ„ μ™„μˆ˜ν•˜κΈ°μœ„ν•œ μž‘μ—…μ˜ κΈ°λ³Έ λ‹¨μœ„
  • λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœλ₯Ό λ³€ν™”μ‹œν‚€λŠ” μž‘μ—…λ“€μ˜ λͺ¨μŒ(꾸러미)
  • 주둜 λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœλ₯Ό λ³€ν™”μ‹œν‚€λŠ” INSERT, DELETE, UPDATE 쀑 1개 μ΄μƒμ˜ DML(Data Manipulation Language)와 ν•¨κ»˜ μ‚¬μš©

μ˜ˆμ‹œ)

  • μœ„ μž‘μ—… 쀑 μ–΄λŠ ν•˜λ‚˜κ°€ μ‹€νŒ¨ν•œλ‹€λ©΄ 'Transaction : Aκ°€ Bμ—κ²Œ 100λ§Œμ›μ„ μž…κΈ‰ν•©λ‹ˆλ‹€.'λŠ” κ²°μ½” μ‹€ν–‰λ˜μ–΄μ„  μ•ˆλ©λ‹ˆλ‹€.

BEGIN

  • νŠΈλžœμž­μ…˜μ˜ μ‹œμž‘μ„ μ•Œλ¦¬λŠ” 것(νŠΈλžœμž­μ…˜ ν•˜λ‚˜λ‹Ή λ°˜λ“œμ‹œ BEGIN/COMMIT λ˜λŠ” BEGIN/ROLLBACK 이 μ„ΈνŠΈλ‘œ μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.)

COMMIT

  • νŠΈλž™μž­μ…˜μ— ν™•μ • μ‹ ν˜Έλ₯Ό μ•Œλ €μ€ŒμœΌλ‘œμ¨ λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜λ˜κ²Œλ” ν•˜λŠ” 것
  • COMMIT을 톡해 ν™•μ • μ‹ ν˜Έλ₯Ό 보내지 μ•ŠλŠ”λ‹€λ©΄ λ°μ΄ν„°λ² μ΄μŠ€μ— λ‚΄μš© λ³€ν™”κ°€ 이루어지지 μ•ŠμŒ
  • 항상 DataBase μ΄μš©μ‹œ Auto-commit by Default ν™•μΈν•˜κ³  끄기(기본적으둜 μžλ™ 컀밋 κΈ°λŠ₯이 μΌœμ ΈμžˆλŠ” 경우 쑰심)

μ˜ˆμ‹œ)

CREATE TABLE user (
    id varchar(10) primary Key,
    name varchar(10)
);

BEGIN # νŠΈλžœμž­μ…˜μ˜ μ‹œμž‘μ„ μ•Œλ¦¬λŠ” 것
INSERT INTO user VALUES ('id1', 'user1');
INSERT INTO user VALUES ('id2', 'user2');
COMMIT; # μ»€λ°‹κΉŒμ§€ ν•΄μ€˜μ•Ό μ‹€μ œ λ°μ΄ν„°λ² μ΄μŠ€μ— 반영이 λ©λ‹ˆλ‹€.

ROLLBACK

  • COMMITκ³Ό λ°˜λŒ€λ˜λŠ” κ°œλ…
  • μ•žμœΌλ‘œ 변경될 μž‘μ—…μ— λŒ€ν•œ λ‚΄μš©μ„ μ·¨μ†Œν•˜κ² λ‹€λŠ” κ°œλ…
  • νŠΈλžœμž­μ…˜ μˆ˜ν–‰ 쀑에 μ§€κΈˆκΉŒμ§€ μˆ˜ν–‰ν•œ λ‚΄μš©μ„ λͺ¨λ‘ μ·¨μ†Œν•˜κ² λ‹€λŠ” 의미

μ˜ˆμ‹œ)

BEGIN;
INSERT INTO user VALUES ('id3', 'user3');
ROLLBACK;

BEGIN;
INSERT INTO user VALUES ('id4', 'user4');
COMMIT;
  • μœ„μ˜ μ˜ˆμ‹œμ—μ„œ id4, user4 만 λ°μ΄ν„°λ² μ΄μŠ€μ— 반영

ACID (Atomicity, Consistency, Isolation, Durability)

  • λ°μ΄ν„°λ² μ΄μŠ€ λ‚΄μ—μ„œ μΌμ–΄λ‚˜λŠ” ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ˜ μ•ˆμ „μ„±μ„ 보μž₯ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μ„±μ§ˆ
  1. Atomicity(μ›μžμ„±)
  • ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ„ κ΅¬μ„±ν•˜λŠ” μž‘μ—…λ“€μ€ μ „λΆ€ 성곡 or μ „λΆ€ 성곡해야함, 즉 λΆ€λΆ„μ μœΌλ‘œ μ‹€ν–‰λ˜λ©΄ μ•ˆλ©λ‹ˆλ‹€.
  • 더 μͺΌκ°œμ§ˆ 수 μ—†λŠ” λ‹¨μœ„μ΄κΈ° λ•Œλ¬Έμ— μ›μžμ„±μ΄λΌ 뢀름
  1. Consistency(일관성)
  • ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜ 이전과 이후 λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœλŠ” 이전과 같이 μœ νš¨ν•΄μ•Όν•œλ‹€λŠ” 의미
  • λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ œμ•½μ΄λ‚˜ κ·œμΉ™μ— μ˜κ±°ν•œ λ°μ΄ν„°λ² μ΄μŠ€μ΄μ–΄μ•Ό ν•œλ‹€λŠ” 의미

μ˜ˆμ‹œ)

CREATE TABLE user (
    id varchar(10) primary Key,
    name varchar(10)
);
  • μœ„μ™€ 같은 user ν…Œμ΄λΈ”μ΄ μžˆμ„ λ•Œ, user ν…Œμ΄λΈ”μ€ λ°˜λ“œμ‹œ id와 name을 κ°€μ§„ κ°’λ§Œ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  1. Isolation(고립성, 격리성)
  • ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄ λ‹€λ₯Έ νŠΈλžœμž­μ…˜κ³Ό λ…λ¦½λ˜μ–΄μ•Ό ν•œλ‹€λŠ” 의미
  • λ™μ‹œμ— μ—¬λŸ¬ 개의 νŠΈλžœμž­μ…˜λ“€μ΄ μˆ˜ν–‰λ  λ•Œ, 각 νŠΈλžœμž­μ…˜μ€ κ³ λ¦½λ˜μ–΄ μ—°μ†μœΌλ‘œ μ‹€ν–‰λœ 것과 λ™μΌν•œ κ²°κ³Όκ°€ λ‚˜μ™€μ•Ό ν•©λ‹ˆλ‹€.

ex)
ν•΄λ‹Ή κ³„μ’Œλ‘œλΆ€ν„° κ³„μ’Œ B 둜 μœ‘μ²œμ›μ˜ κ³„μ’Œ 이체λ₯Ό ν•˜λŠ” νŠΈλžœμž­μ…˜
ν•΄λ‹Ή κ³„μ’Œλ‘œλΆ€ν„° κ³„μ’Œ C 둜 μœ‘μ²œμ›μ˜ κ³„μ’Œ 이체λ₯Ό ν•˜λŠ” νŠΈλžœμž­μ…˜

B둜 μ΄μ²΄ν•˜λŠ” νŠΈλžœμž­μ…˜κ³Ό C둜 μ΄μ²΄ν•˜λŠ” νŠΈλžœμž­μ…˜μ΄ 아무리 λ™μ‹œμ— μ§„ν–‰λœλ‹€ν•΄λ„ B 이후 C κ°€ μ§„ν–‰λ˜λŠ” 결과와 κ°™μ•„μ•Ό 함
λ§Œμ•½, 이 고립성이 μ—†λ‹€λ©΄, κ³„μ’Œμ— 돈이 없어도 돈이 λΉ μ Έλ‚˜κ°€λŠ” 상황이 λ°œμƒν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

  1. Durability(지속성)
  • ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄ μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰λ˜μ—ˆλ‹€λ©΄ ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ— λŒ€ν•œ λ‘œκ·Έκ°€ 남아야 ν•©λ‹ˆλ‹€.
  • 심지어 μ—λŸ¬, μ‹œμŠ€ν…œ μ—λŸ¬ λ“± μ–΄λ–€ μ—λŸ¬κ°€ λ°œμƒν•΄λ„ ν•΄λ‹Ή 기둝(둜그)은 영ꡬ적으둜 남아야 ν•©λ‹ˆλ‹€.

ex)
κ°„λ‹¨ν•œ 예둜 μ€ν–‰μ—μ„œ κ³„μ’Œμ΄μ²΄λ₯Ό μ„±κ³΅μ μœΌλ‘œ ν•œ 뒀에 ν•΄λ‹Ή 은행 λ°μ΄ν„°λ² μ΄μŠ€μ— 였λ₯˜κ°€ λ°œμƒν•΄ μ’…λ£Œκ°€ λ˜μ–΄λ„ κ³„μ’Œμ΄μ²΄ 내역은 남아야 ν•©λ‹ˆλ‹€.
λ§ˆμ°¬κ°€μ§€λ‘œ κ³„μ’Œμ΄μ²΄λ₯Ό 둜그둜 κΈ°λ‘ν•˜κΈ° 전에 μ‹œμŠ€ν…œ 였λ₯˜ 등에 μ˜ν•΄ μ’…λ£Œκ°€ λœλ‹€λ©΄ ν•΄λ‹Ή 이체 내역은 μ‹€νŒ¨λ‘œ λŒμ•„κ°€κ³  각 κ³„μ’Œλ“€μ€ κ³„μ’Œμ΄μ²΄ 이전 μƒνƒœλ“€λ‘œ λŒμ•„κ°€κ²Œ λ©λ‹ˆλ‹€.