[SQL] νŠΈλžœμž­μ…˜

[원본 링크]

νŠΈλžœμž­μ…˜μ€ DB의 핡심 κΈ°λŠ₯ 쀑 ν•˜λ‚˜λ‹€.

보톡 λ°μ΄ν„°λ² μ΄μŠ€μ˜ λ³Έμ§ˆμ„ 이야기할 λ•Œ κ±°λ‘ λ˜λŠ” 것 쀑 ν•˜λ‚˜κ°€ μ›μžμ„±μ΄λ‹€.
일정 μ‹€ν–‰ λ‹¨μœ„λ₯Ό λ¬Άμ–΄μ„œ, 그게 ν•˜λ‚˜μ˜ κΈ°λ³Έ λ‹¨μœ„λ‘œ λ™μž‘ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 것이닀.

ν•œλ²ˆ 예λ₯Ό 듀어보겠닀.
μ†ŒλΉ„μžλ₯Ό λ‚˜νƒ€λ‚΄λŠ” A ν…Œμ΄λΈ”μ΄ 있고, 판맀자λ₯Ό λ‚˜νƒ€λ‚΄λŠ” B ν…Œμ΄λΈ”μ΄ μžˆλ‹€.
λ§Œμ•½μ— 거래λ₯Ό ν•΄μ„œ Aκ°€ Bμ—κ²Œμ„œ 물건을 κ΅¬λ§€ν•œλ‹€λ©΄, μΌλ°˜μ μœΌλ‘œλŠ” AλŠ” 돈이 μ‚­κ°λ˜κ³  λ‚˜μ„œ λ¬Όν’ˆμ΄ 지급될 것이고, BλŠ” 돈이 μΆ”κ°€λ˜κ³  λ¬Όν’ˆμ΄ 쀄어듀 것이닀. 이 κ±°λž˜λŠ” ν•˜λ‚˜μ˜ μ™„μ„±λœ μž‘μ—…μ΄μ–΄μ•Ό ν•œλ‹€.
λ§Œμ•½ 쀑간에 였λ₯˜κ°€ λ‚˜μ„œ A의 돈만 쀄어듀고 λ¬Όν’ˆμ΄ λ“€μ–΄μ˜€μ§€ μ•ŠλŠ”λ‹€λ©΄ μ΄λŠ” μ‹¬κ°ν•œ λ¬Έμ œκ°€ λœλ‹€.

κ·Έλž˜μ„œ λ°”λžŒμ§ν•œ 둜직이라면 였λ₯˜ λ°œμƒ μ‹œ 아무것도 μˆ˜μ •λ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.

이λ₯Ό κ°„λ‹¨νžˆ μˆ˜ν–‰ν•  수 있게 ν•΄μ£ΌλŠ” 것이 λ°”λ‘œ νŠΈλžœμž­μ…˜μ΄λž€ κΈ°λŠ₯이닀.
μ—¬λŸ¬κ°œμ˜ 쿼리λ₯Ό ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μœΌλ‘œ λ¬Άμ–΄μ„œ, μ™„μ „ 성곡, μ•„λ‹ˆλ©΄ μ™„μ „ μ‹€νŒ¨μ˜ λ‘˜λ‘œλ§Œ κ²°κ³Όλ₯Ό ꡬ뢄할 수 μžˆλŠ” 것이닀.

ν•œλ²ˆ λŒλ €λ³΄λ©΄μ„œ μ‚΄νŽ΄λ³΄μž.
ν…ŒμŠ€νŠΈ ν™˜κ²½μ€ PostgreSQLμ΄λ‚˜, λ‹€λ₯Έ RDB듀도 별 μ°¨μ΄λŠ” 없을 것이닀.

λŒ€μΆ© idκ°’κ³Ό ν…μŠ€νŠΈκ°’μ„ κ°€μ§€λŠ” ν…Œμ΄λΈ”μ΄ μžˆλ‹€.

νŠΈλžœμž­μ…˜μ˜ μ‹œμž‘μ€ begin transaction으둜 μˆ˜ν–‰ν•  수 μžˆλ‹€.
μ΄μ œλΆ€ν„° 이 μ—°κ²°μ—μ„œ μ‹€ν–‰λ˜λŠ” 쿼리듀은 μ „λΆ€ 이 νŠΈλžœμž­μ…˜ μ•ˆμ— 'κ°‡νžŒλ‹€.'

둜우 ν•˜λ‚˜λ₯Ό μ‚­μ œν•΄λ΄€λ‹€.

μ •μƒμ μœΌλ‘œ μ‚­μ œν–ˆλ‹€κ³  뜨고,

select해봐도 잘 μ‚­μ œλœ 것을 확인할 수 μžˆλ‹€.

이 μƒνƒœμ—μ„œ μ € μ—°κ²° 말고, 터미널 ν•˜λ‚˜ 더 μ—΄μ–΄μ„œ μ ‘μ†ν•˜κ³  λ˜‘κ°™μ΄ selectλ₯Ό ν•΄λ΄€λ‹€.

음? λ°”λ€Œμ§€ μ•Šμ€ 것을 확인할 수 μžˆλ‹€.
방금 μˆ˜ν–‰ν•œ κ·Έ μž‘μ—…μ€ νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œ 싀행됐기 λ•Œλ¬Έμ—, κ·Έ μ•ˆμ—μ„œλ§Œ κ°‡ν˜€μžˆκ³  μ‹€μ œλ‘œλŠ” μ μš©λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

λ‹€μ‹œ λŒμ•„κ°€μ„œ, rollback을 쳐봀닀.

그럼 μ‚­μ œν–ˆλ˜κ²Œ λ‹€μ‹œ μ›λ³΅λœλ‹€.
보톡 뭐 ν•˜λ‚˜λΌλ„ 였λ₯˜κ°€ λ°œμƒν•˜κ±°λ‚˜ 잘λͺ»λœ 게 있으면 항상 둀백으둜 νŠΈλžœμž­μ…˜ λ‚΄μ˜ μž‘μ—…μ„ μ „λΆ€ μ·¨μ†Œν•΄λ²„λ¦°λ‹€.

μ‹€ν–‰ν•œ λ‚΄μš©λ“€μ— 아무 λ¬Έμ œλ„ μ—†λ‹€λ©΄, λ°˜λŒ€λ‘œ κ·Έλƒ₯ commit λͺ…λ Ήλ§Œ μ‚¬μš©ν•˜λ©΄ λœλ‹€.
이건 νŠΈλžœμž­μ…˜μ—μ„œ μˆ˜ν–‰ν•œ λ‚΄μš©λ“€μ„ μ „λΆ€ μ‹€μ œ DB에 λ‹€ μ μš©ν•œλ‹€.

생각보닀 κ°„λ‹¨ν•˜λ‹€.
begin transaction.
commit
rollback
이 μ…‹λ§Œ μ•Œλ©΄ λœλ‹€.