๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿช CS

ํŠธ๋žœ์žญ์…˜์ด ๋ญ”๊ฐ€์š”?

Transaction์ด๋ž€

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์˜ ๋‹จ์œ„ ์ฆ‰, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฟผ๋ฆฌ๋“ค์„ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๋‹จ์œ„๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค ๐Ÿ™‹‍โ™€๏ธ

๋…ผ๋ฆฌ์ ์ธ ์ด์œ ๋กœ ์—ฌ๋Ÿฌ SQL๋ฌธ๋“ค์„ ๋‹จ์ผ ์ž‘์—…์œผ๋กœ ๋ฌถ์–ด์„œ ๋‚˜๋ˆ ์งˆ ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

  • database ์ฟผ๋ฆฌ๋ฌธ ๋‘ ๊ฐœ๊ฐ€ ์ •์ƒ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ๋งŒ ์„ฑ๊ณตํ•˜๋Š” ๋‹จ์ผ ์ž‘์—…
  • transaction์˜ SQL๋ฌธ๋“ค ์ค‘์— ์ผ๋ถ€๋งŒ ์„ฑ๊ณตํ•ด์„œ DB์— ๋ฐ˜์˜๋˜๋Š” ์ผ์€ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

 

 

 

์ผ๋ฐ˜์ ์ธ transaction ์‚ฌ์šฉ ํŒจํ„ด


  1. transaction์„ ์‹œ์ž‘(begin)
  2. ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ๋“ฑ์˜ SQL๋ฌธ๋“ค์„ ํฌํ•จํ•ด์„œ ๋กœ์ง์„ ์ˆ˜ํ–‰
  3. ์ผ๋ จ์˜ ๊ณผ์ •๋“ค์„ ๋ฌธ์ œ์—†์ด ๋™์ž‘ํ–ˆ๋‹ค๋ฉด transaction์„ commit
  4. ์ค‘๊ฐ„์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด transaction์„ rollback

 

 

์ปค๋ฐ‹(commit)

์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค๊ณ  ํ™•์ •ํ•˜๋Š” ๋ช…๋ น์–ด

  • ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ์ˆ˜ํ–‰
  • ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์ด ๋ชจ๋‘ ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • "์ปค๋ฐ‹์ด ์ˆ˜ํ–‰๋˜์—ˆ๋‹ค." == "ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ๋‹ค."
  • update, insert, delete์˜ ์ฟผ๋ฆฌ๊ฐ€ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ์ˆ˜ํ–‰๋˜๊ณ , ์ดํ›„์— DB์— ์˜๊ตฌ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

 

๋กค๋ฐฑ(rollback)

ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ํ•˜๋‚˜์˜ ๋ฌถ์Œ ๊ณผ์ •์„ ์ผ์–ด๋‚˜๊ธฐ ์ „์œผ๋กœ ๋Œ๋ฆฌ๋Š” ์ผ

  • ์ง€๊ธˆ๊นŒ์ง€ ์ž‘์—…๋“ค์„ ๋ชจ๋‘ ์ทจ์†Œํ•˜๊ณ  transaction ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค. ์ฆ‰ ์ทจ์†Œ!
  • ์—๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ ์ด์Šˆ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜ ์ „์œผ๋กœ ๋Œ๋ ค์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ

 

 

๐Ÿ’ก ์ปค๋ฐ‹๊ณผ ๋กค๋ฐฑ ๋•์— ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ „์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ํ•ด๋‹น ์ž‘์—…์„ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ

ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ์—ฌ๋Ÿฌ ๋กœ์ง๋“ค์„ ๋ฌถ์„ ๋•Œ ์™ธ๋ถ€ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์žˆ๋‹ค๋ฉด ๋กค๋ฐฑ์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ๋ฅผ ์‹ ๊ฒฝ ์จ์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํŠธ๋žœ์žญ์…˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ปค๋„ฅ์…˜ ๋‹จ์œ„๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋„ฅ์…˜ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฅผ ๋งค๋ฒˆ ๋„˜๊ฒจ์ฃผ๊ธฐ๊ฐ€ ์–ด๋ ต๊ณ  ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋„˜๊ฒจ์„œ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ จ ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ์„ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์— ๋ฌถ์ด๋„๋ก ํ•˜๋Š” ๊ฒƒ

@Service
@Transactional(readOnly = true)
public class MemberService {
	private final MemberRepository memberRepository;

	public MemberService(MemberRepository memberRepository) {
		this.memberRepository = memberRepository;
	}
}

  • @Transactional ์• ๋„ˆํ…Œ์ด์…˜์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ ๊ด€๋ จ๋“ค์„ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌ
  • commit(), rollback() ๋“ฑ์„ ์“ฐ์ง€ ์•Š๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง๋งŒ ์ž‘์„ฑ

 

 

 

ACID

ํŠธ๋žœ์žญ์…˜์ด ์–ด๋– ํ•œ ๊ธฐ๋Šฅ์„ ์ง€๋…€์•ผํ•˜๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน์„ฑ์œผ๋กœ ์›์ž์„ฑ, ์ผ๊ด€์„ฑ, ๋…๋ฆฝ์„ฑ, ์ง€์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

1. ์›์ž์„ฑ(atomicity)

"all or nothing" ํŠธ๋žœ์žญ์…˜๊ณผ ๊ด€๋ จ๋œ ์ผ์ด ๋ชจ๋‘ ์ˆ˜ํ–‰๋˜์—ˆ๊ฑฐ๋‚˜ ์•„์˜ˆ ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜๋ฅผ ๋ณด์žฅํ•˜๋Š” ํŠน์ง•

 

์˜ˆ๋ฅผ ๋“ค์–ด ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ–ˆ๋Š”๋ฐ, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋กค๋ฐฑํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ ์ดํ›„์— ๋ชจ๋‘ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ

  • ํŠธ๋žœ์žญ์…˜์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ชผ๊ฐœ์งˆ ์ˆ˜ ์—†๋Š” ์ž‘์—… ๋‹จ์œ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€์˜ SQL๋ฌธ๋“ค์ด ๋ชจ๋‘ ์„ฑ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ค‘๊ฐ„์— SQL๋ฌธ์ด ์‹คํŒจํ•˜๋ฉด ์ง€๊ธˆ๊นŒ์ง€์˜ ์ž‘์—…์„ ๋ชจ๋‘ ์ทจ์†Œํ•˜์—ฌ ์•„๋ฌด ์ผ๋„ ์—†์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ rollback ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋Š” ์–ธ์ œ commitํ•˜๊ฑฐ๋‚˜ rollbackํ• ์ง€๋ฅผ ์ฑ™๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

2. ์ผ๊ด€์„ฑ(consistency)

'ํ—ˆ์šฉ๋œ ๋ฐฉ์‹'์œผ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ธฐ๋ก๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์กฐ๊ฑด, ๊ทœ์น™์— ๋”ฐ๋ผ ์œ ํšจํ•จ์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด A๋Š” 1000๋งŒ ์›์ด ์žˆ๊ณ  B๋Š” 0์›์ด ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, B๊ฐ€ A์—๊ฒŒ 500๋งŒ์›์„ ์ž…๊ธˆํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ฃ . 0์›์œผ๋กœ๋ถ€ํ„ฐ 500๋งŒ์›์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ํŠธ๋žœ์žญ์…˜์€ DB ์ƒํƒœ๋ฅผ consistent ์ƒํƒœ์—์„œ ๋˜ ๋‹ค๋ฅธ consistent ์ƒํƒœ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • constraint, trigger ๋“ฑ์„ ํ†ตํ•ด DB์— ์ •์˜๋œ ๋ฃฐ์„ ํŠธ๋žœ์žญ์…˜์ด ์œ„๋ฐ˜ํ–ˆ๋‹ค๋ฉด rollback ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์ด DB์— ์ •์˜๋œ ๋ฃฐ์„ ์œ„๋ฐ˜ํ–ˆ๋Š”์ง€๋Š” DBMS๊ฐ€ ์ปค๋ฐ‹ ์ „์— ํ™•์ธํ•˜๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋Š” ํŠธ๋žœ์žญ์…˜์ด consistentํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ์ฑ™๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

3. ๊ฒฉ๋ฆฌ์„ฑ(isolation)

ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰ ์‹œ ์„œ๋กœ ๋ผ์–ด๋“ค์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ

  • ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜๋“ค์ด ๋™์‹œ์— ์‹คํ–‰๋˜์–ด๋„ ๋งˆ์น˜ ๊ฐ๊ฐ์ด ๊ฒฉ๋ฆฌ๋˜์–ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜๋“ค๋กœ๋ถ€ํ„ฐ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ  ํ˜ผ์ž ๋™์ž‘ํ•˜๋Š” ๊ฒƒ
  • ๋ณต์ˆ˜์˜ ๋ณ‘๋ ฌ ํŠธ๋žœ์žญ์…˜์€ ์„œ๋กœ ๊ฒฉ๋ฆฌ๋˜์–ด ๋งˆ์น˜ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘๋™๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ˆœ์ฐจ์ ์œผ๋กœ ํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋˜๊ฒ ์ง€๋งŒ ์„ฑ๋Šฅ์ด ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค.

more: ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

 

4. ์ง€์†์„ฑ(durabilitiy)

์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ ํŠธ๋žœ์žญ์…˜์€ ์˜์›ํžˆ ๋ฐ˜์˜๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ ์ปค๋ฐ‹๋œ ํŠธ๋žœ์žญ์…˜์€ DB์— ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • DB ์‹œ์Šคํ…œ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ๋„ ์ปค๋ฐ‹๋œ ํŠธ๋žœ์žญ์…˜์€ DB์— ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ‘์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•œ๋‹ค’๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ‘๋น„ํœ˜๋ฐœ์„ฑ ๋ฉ”๋ชจ๋ฆฌ(ํ•˜๋“œ๋””์Šคํฌ, SSD, …)์— ์ €์žฅํ•จ’์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‹œ์Šคํ…œ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์›๋ž˜ ์ƒํƒœ๋กœ ๋ณต๊ตฌํ•˜๋Š” ํšŒ๋ณต ๊ธฐ๋Šฅ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ด๋ฅผ ์œ„ํ•ด ์ฒดํฌ์„ฌ, ์ €๋„๋ง, ๋กค๋ฐฑ ๋“ฑ์˜ ๊ธฐ๋Šฅ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์ฒดํฌ์„ฌ : ์ค‘๋ณต ๊ฒ€์‚ฌ์˜ ํ•œ ํ˜•ํƒœ๋กœ, ์˜ค๋ฅ˜ ์ •์ •์„ ํ†ตํ•ด ์†ก์‹ ๋œ ์ž๋ฃŒ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณดํ˜ธํ•˜๋Š” ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•
  • ์ €๋„๋ง : ํŒŒ์ผ ์‹œ์Šคํ…œ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜(commit)ํ•˜๊ธฐ ์ „์— ๋กœ๊น…ํ•˜๋Š” ๊ฒƒ, ํŠธ๋žœ์žญ์…˜ ๋“ฑ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” ๊ฒƒ