본문 바로가기
BackEnd/Database

[DB] Transaction(트랜잭션) - Commit, Rollback

by ryuneng 2025. 1. 20.
반응형

# 목적

: Transaction(트랜잭션)에 대한 이해




트랜잭션 이란?

- 논리적인 작업 단위를 구성하는 데이터 조작 명령문의 모음
- ex)

  • 이체하기
  1. 내 계좌의 잔액 감소 - UPDATE
  2. 상대방 계좌의 잔액 증가 - UPDATE
  3. 내 계좌에 이체 발송 내용 추가 - INSERT
  4. 상대방 계좌에 이체 수신 내용 추가 - INSERT

-> 4번의 DML 작업으로 구성되는 논리적인 작업단위




트랜잭션의 사용 목적

- 트랜잭션 내의 명령문 중 하나라도 실행되지 못하면 나머지 명령문도 모두 데이터베이스 반영이 취소되어야 함
- 트랜잭션내의 명령문이 모두 성공적으로 실행되면 데이터베이스에 영구적으로 실행결과를 반영시킴
- 데이터의 일관성이 깨지지 않도록 하는 것이 목적




트랜잭션 처리 명령어

COMMIT

- 논리적인 작업 단위를 구성하는 모든 작업이 성공적으로 완료되었을 때,
데이터베이스의 트랜잭션 관리자에게 해당 작업 단위 내에서 실행했던 처리 결과를 영구적으로 데이터베이스에 반영시키게 함

ROLLBACK

- 논리적인 작업 단위를 구성하는 작업 줄에서 오류가 발생했을 때,
데이터베이스의 트랜잭션 관리자에게 해당 작업 단위 내에서 실행했던 처리 결과의 데이터베이스 반영을 취소시키게 함




트랜잭션의 시작과 종료

트랜잭션의 시작

- 첫번째 DML 명령이 실행될 때 새 트랜잭션이 자동으로 시작됨
- COMMIT, ROLLBACK 명령 실행 시 기존 트랜잭션 종료 후 새로운 트랜잭션이 시작됨

트랜잭션의 종료

- COMMIT, ROLLBACK 명령 실행 시 기존 트랜잭션이 종료됨
- DBMS에 시스템 장애가 발생할 때 AUTO-ROLLBACK이 실행되면서 트랜잭션이 종료됨




COMMIT, ROLLBACK의 이해

1. COMMIT 실행 후

- 데이터베이스에 데이터를 영구적으로 반영시킴
- 트랜잭션 실행 이전 상태를 완전히 상실함(이전 상태로 되돌아갈 수 없음)
- 변경된 레코드(데이터 행)의 LOCK이 해제되어 다른 사용자(트랜잭션)가 변경할 수 있게 됨

2. ROLLBACK 실행 후

- 트랜잭션 실행 이전 상태로 데이터의 상태를 복구시킴
- 변경된 레코드(데이터 행)의 LOCK이 해제되어 다른 사용자(트랜잭션)가 변경할 수 있게 됨




# 예시

------------------------------------------------------------ 트랜잭션1 시작
UPDATE ACCOUNTS
SET
    DEPOSIT = DEPOSIT - 1000000
WHERE
    NO = 10;                       -- 트랜잭션1의 연산
    
UPDATE ACCOUNTS
SET
    DEPOSIT = DEPOSIT + 1000000
WHERE
    NO = 20;                       -- 트랜잭션1의 연산

INSERT INTO HISTORIES
VALUES (10, 20, 1000000, SYSDATE); -- 트랜잭션1의 연산

COMMIT;                            -- 트랜잭션1의 모든 연산이 오류없이 실행되었기 때문에
                                   -- 트랜잭션관리자에게 트랜잭션1의 처리결과를
                                   -- 영구적으로 데이터베이스에 반영시키도록 함
------------------------------------------------------------ 트랜잭션1 종료
------------------------------------------------------------ 트랜잭션2 시작
UPDATE ACCOUNTS
SET
    DEPOSIT = DEPOSIT - 50000      -- 트랜잭션2의 연산
WHERE
    NO = 70;

UPDATE ACCOUNTS
SET
    DEPOSIT = DEPOSIT + 50000      -- 트랜잭션2의 연산
WHERE
    NO = 120;
    
INSERT INTO HISTORIES
VALUES (70, 120, 50000);           -- 트랜잭션2의 연산

ROLLBACK;                          -- 트랜잭션2의 INSERT 작업중 오류가 발생함
                                   -- 트랜잭션관리자에게 트랜잭션2의 처리결과를 모두 취소시키도록 함
------------------------------------------------------------ 트랜잭션2 종료
------------------------------------------------------------ 트랜잭션3 시작

 


< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >

🔗 velog 버전 보기 : https://velog.io/@ryuneng2/DB-Transaction-트랜잭션-Commit-Rollback