πŸ—„οΈ Backend/Oracle

였라클(Oracle) - TCL (νŠΈλžœμž­μ…˜) COMMIT, ROLLBACK

kongmi 2023. 2. 23. 19:26

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

  • 'μͺΌκ°€ 수 μ—†λŠ” 업무 처리의 μ΅œμ†Œ λ‹¨μœ„' ν˜Ήμ€ '거래 λ‚΄μ—­'이라고도 ν•œλ‹€.

μ •μ˜λ§Œ λ“€μ—ˆμ„ λ•ŒλŠ” 이해가 잘 μ•ˆλ˜μ‹œμ£ ? (일단 μ €λŠ” 이해가 잘 μ•ˆλμŠ΅λ‹ˆλ‹€. ^^;

 

κ°€μž₯ λŒ€ν‘œμ μΈ 예둜 은행 κ³„μ’Œμ΄μ²΄λ₯Ό λ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.


Aκ°€ Bμ—κ²Œ 1000원을 μ΄μ²΄ν•˜κ³ , Bκ°€ κ·Έ λˆμ„ 받은 경우, 이 거래 기둝은 더 이상 μž‘κ²Œ μͺΌκ°€ 수 μ—†λŠ” ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜ μž…λ‹ˆλ‹€.

λ§Œμ•½ AλŠ” Bμ—κ²Œ λˆμ„ μ΄μ²΄ν–ˆμœΌλ‚˜ BλŠ” λˆμ„ λ°›μ§€ λͺ»ν–ˆλ‹€λ©΄ κ·Έ κ±°λž˜λŠ” μ„±λ¦½λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


이 μ˜ˆμ‹œμ™€ 같이 Aκ°€ λˆμ„ μ§€λΆˆν•˜λŠ” ν–‰μœ„μ™€ Bκ°€ λˆμ„ λ°›λŠ” ν–‰μœ„λŠ” λ³„κ°œλ‘œ 뢄리될 수 μ—†μœΌλ©°, ν•˜λ‚˜μ˜ κ±°λž˜λ‚΄μ—­μœΌλ‘œ μ²˜λ¦¬λ˜μ–΄μ•Ό ν•˜λŠ” 단일 거래 μž…λ‹ˆλ‹€. 이런 거래의 μ΅œμ†Œ λ‹¨μœ„λ₯Ό νŠΈλžœμž­μ…˜μ΄λΌκ³  ν•©λ‹ˆλ‹€.

 

νŠΈλžœμž­μ…˜ μ²˜λ¦¬κ°€ μ •μƒμ μœΌλ‘œ μ™„λ£Œλœ 경우 COMMIT을 ν•˜κ³ ,

였λ₯˜κ°€ λ°œμƒν•  경우 μ›λž˜ μƒνƒœλŒ€λ‘œ ROLLBACK을 ν•©λ‹ˆλ‹€.

νŠΉμ„±

  • μ›μžμ„±(Automicity)
    νŠΈλžœμž­μ…˜μ—μ„œ μ •μ˜λœ 연산듀은 λͺ¨λ‘ μ„±κ³΅μ μœΌλ‘œ μ‹€ν–‰λ˜λ˜μ§€ μ•„λ‹ˆλ©΄
    μ „ν˜€ μ‹€ν–‰λ˜μ§€ μ•Šμ€ μƒνƒœλ‘œ 남아 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. (All or Nothing)
  • 일관성(Consistency)
    νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλœ 결과값이 일관적인 DB μƒνƒœλ₯Ό μœ μ§€ν•˜λŠ” 것을 의미
    즉, νŠΈλžœμž­μ…˜μ΄ μ§„ν–‰λ˜λŠ” λ™μ•ˆ λ°μ΄ν„°λ² μ΄μŠ€κ°€ λ³€κ²½λ˜λ”λΌλ„ μ—…λ°μ΄νŠΈλœ λ°μ΄ν„°λ² μ΄μŠ€λ‘œ νŠΈλžœμž­μ…˜μ΄ μ§„ν–‰λ˜λŠ” 것이 μ•„λ‹ˆλΌ 처음 νŠΈλžœμž­μ…˜μ„ μ§„ν–‰ν•˜κΈ° μœ„ν•΄ μ°Έμ‘°ν•œ λ°μ΄ν„°λ² μ΄μŠ€λ‘œ μ§„ν–‰λ©λ‹ˆλ‹€.
  • 고립성(Isolation)
    ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜ μˆ˜ν–‰μ‹œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ˜ μž‘μ—…μ΄ 끼어듀지 λͺ»ν•˜λ„둝 보μž₯ν•˜λŠ” 것
    즉, νŠΈλžœμž­μ…˜μ΄ μ‹€ν–‰ν•˜λŠ” 도쀑에 λ³€κ²½ν•œ λ°μ΄ν„°λŠ” 이 νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μ°Έμ‘°ν•˜μ§€ λͺ»ν•œλ‹€.
  • μ˜μ†μ„±(Durability)
    νŠΈλžœμž­μ…˜μ΄ μ •μƒμ μœΌλ‘œ μ’…λ£Œλœ λ‹€μŒμ—λŠ” 영ꡬ적으둜 λ°μ΄ν„°λ² μ΄μŠ€μ— μž‘μ—…μ˜ κ²°κ³Όκ°€ μ €μž₯λœλ‹€.

COMMITκ³Ό ROLLBACK

  • COMMIT : νŠΈλžœμž­μ…˜μ„ λ°μ΄ν„°λ² μ΄μŠ€μ— 반영
  • ROLLBACK : νŠΈλžœμž­μ…˜μ„ λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜ν•˜μ§€ μ•ŠμŒ

 

🐸 COMMIT μ΄μ „μ—λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ— 영ꡬ적으둜 변경사항이 적용되기 전이기 λ•Œλ¬Έμ— μ΄μ „λ°μ΄ν„°λ‘œ 볡ꡬ가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

SELECT문을 μ΄μš©ν•˜μ—¬ μž‘μ—…μžλŠ” λ³€κ²½ν•œ 사항을 확인할 수 있으며, λ‹€λ₯Έ μ‚¬μš©μžλŠ” λ³€κ²½ 사항을 확인할 수 μ—†μŠ΅λ‹ˆλ‹€.

λ³€κ²½λœ 행은 LOCK이 μ„€μ •λ˜μ–΄ μžˆλŠ” μƒνƒœλ‘œ λ‹€λ₯Έ μ‚¬μš©μžλŠ” λ³€κ²½ν•  수 μ—†λŠ” μƒνƒœκ°€ λ©λ‹ˆλ‹€.

μ΄κ²ƒμœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ˜ 데이터 일관성을 μ œκ³΅ν•©λ‹ˆλ‹€.

 

🐸 COMMIT μ΄ν›„μ—λŠ” 변경사항이 영ꡬ적으둜 λ°μ΄ν„°λ² μ΄μŠ€μ— 반영이 되며 이전 μƒνƒœλŠ” μ™„.μ „.히 μƒμ‹€ν•˜κ²Œ λ©λ‹ˆλ‹€.

μž‘μ—…μžλ₯Ό 포함해 λͺ¨λ“  μ‚¬μš©μžκ°€ λ³€κ²½ 사항을 μ‘°νšŒν•  수 있으며 LOCK이 μ„€μ •λ˜μ–΄ 있던 ν–‰μ˜ LOCK이 ν•΄μ œλ©λ‹ˆλ‹€.

 

πŸ“Œ μΆ”ν›„, νŠΈλžœμž­μ…˜μ€ JAVA의 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(Spring Boot)μ—μ„œ κ΅¬ν˜„ν•  μ˜ˆμ •


🚨참고🚨

1. DDL(ν…Œμ΄λΈ” 생성/λ³€κ²½/μ‚­μ œμ™€ 같은..)은 COMMIT, ROLLBACK 영ν–₯이 μ•ˆλ―ΈμΉ˜κΈ° λ•Œλ¬Έμ— COMMIT μ•ˆν•΄λ„ ν…Œμ΄λΈ” 생성 λ©λ‹ˆλ‹€.

2. UPDATE ν•œ 것을 COMMIT 되기 전에 또 λ°”κΎΈλ €κ³  ν•˜λ©΄ μž‘μ—…λŒ€κΈ° κ±Έλ¦½λ‹ˆλ‹€.

   JAVA μ½”λ“œ λ¬Έμ œκ°€ μ•„λ‹Œλ°λ„ λΆˆκ΅¬ν•˜κ³ , 잘 λͺ¨λ₯΄κΈ° λ•Œλ¬Έμ— λ‹Ήν™©ν•  수 μžˆμœΌλ‹ˆ κΌ­! μœ μ˜ν•˜μ„Έμš”.

3. 이럴 경우, μš°μ„ μˆœμœ„κ°€ μžˆλŠ” 곳에 COMMIT을 날리면 μž‘μ—…λŒ€κΈ° 걸렸던 κ³³μ—μ„œλ„ μžλ™μ μœΌλ‘œ 반영 λ©λ‹ˆλ‹€.

4. 같은 λ§μ΄μ§€λ§Œ COMMIT을 ν•˜λ©΄ μ—¬λŸ¬ μ„Έμ…˜μ—μ„œ λ³€κ²½ν–ˆλ˜ 사항도 영ꡬ적으둜 ν•œλ²ˆμ— μ μš©λ©λ‹ˆλ‹€.

5. ROLLBACK은 νŠΈλžœμž­μ…˜μ΄ μ‹œμž‘λ˜κΈ° μ΄μ „μ˜ μƒνƒœλ‘œ λ˜λŒμ•„κ°‘λ‹ˆλ‹€.

6. LOCK은 JAVA의 Syncronized와 같은 κ°œλ…μœΌλ‘œ ν™”μž₯μ‹€ ν•œ 칸을 μƒκ°ν•˜λ©΄ λ©λ‹ˆλ‹€.

(κ·Έλž˜μ„œ COMMIT ν•˜κΈ° μ „κΉŒμ§€λŠ” μˆ˜μ •ν•΄λ„ 반영 μ•ˆλ˜κ³  μž‘μ—…λŒ€κΈ° κ±Έλ¦½λ‹ˆλ‹€.)


예제

DEPT_TCL ν…Œμ΄λΈ” 생성

CREATE TABLE DEPT_TCL
	AS SELECT *
	FROM DEPT; -- 볡사

ν–‰ 데이터 μΆ”κ°€

INSERT INTO DEPT_TCL VALUES(50, 'DATABASE', 'SEOUL');

Dbeaver
cmd

🐢 νŠΈλžœμž­μ…˜μ„ COMMIT μ•ˆν–ˆκΈ° λ•Œλ¬Έμ— CMDμ—μ„œλŠ” 데이터 μΆ”κ°€ 반영 μ•ˆλ˜μ—ˆμŒ 확인.

 

데이터 λ³€κ²½

(DEPTNO 40번 ν–‰ LOC λ³€κ²½)

UPDATE DEPT_TCL SET LOC = 'BUSAN'
	WHERE DEPTNO = 40;

방금 λ³€κ²½ν–ˆλ˜ ν–‰(DEPT 40번) CMDμ—μ„œ μΆ”κ°€ λ³€κ²½

-- CMDμ—μ„œ μ»€λ§¨λ“œ λ‚ λ¦Ό
UPDATE DEPT_TCL SET LOC = 'ULSAN' WHERE DEPTNO = 40;

🐢 ν•˜μ§€λ§Œ λ³€κ²½λ˜μ§€ μ•Šκ³  μž‘μ—…λŒ€κΈ°κ°€ κ±Έλ¦Ό

 

COMMIT

-- Dbeaver
COMMIT;

μš°μ„ μˆœμœ„κ°€ μžˆλŠ” Dbeaver에 COMMIT을 λ‚ λ¦¬μž CMDμ—μ„œλ„ μžλ™μœΌλ‘œ λ°˜μ˜λ˜λŠ” 것 확인