# 목적
: Transaction(트랜잭션)에 대한 이해
트랜잭션 이란?
- 논리적인 작업 단위를 구성하는 데이터 조작 명령문의 모음
- ex)
- 이체하기
- 내 계좌의 잔액 감소 - UPDATE
- 상대방 계좌의 잔액 증가 - UPDATE
- 내 계좌에 이체 발송 내용 추가 - INSERT
- 상대방 계좌에 이체 수신 내용 추가 - 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
'BackEnd > Database' 카테고리의 다른 글
[DB] 무결성 제약조건(Constraint) (0) | 2025.01.20 |
---|---|
[DB] Oracle의 DDL (0) | 2025.01.20 |
[DB] SubQuery(서브쿼리) (0) | 2025.01.20 |
[DB] Join(조인) (0) | 2025.01.20 |
[DB] Oracle의 내장함수 - 그룹함수(다중행 함수)와 GROUP BY(그룹화) (0) | 2025.01.20 |