728x90
1. 정의
- 사전적 의미: 거래
- CS 분야에서의 의미: 더이상 분할이 불가능한 업무처리의 단위
👉 한꺼번에 수행되어야 할 일련의 연산 모음
만약,
계좌이체 시 인출에는 성공했는데
입금에 실패하면?
👉 경제적 손실이라는 치명적인 결과
👉 이 두 과정은 동시에 성공하든지 동시에 실패해야 함
👉 이 과정을 동시에 묶는 방법이 바로 트랜잭션
START TRANSACTION
-- 이 사이의 명령어들은 하나의 명령어처럼 처리됨
-- 성공 or 실패 둘 중 하나
A의 계좌로부터 인출;
B의 계좌로 입금;
COMMIT
👉 데이터 거래에 있어서 안전성을 확보하기 위한 방법.
- 오류가 발생 시 결과 재반영 X, 모든 작업을 원상태로 복구
- 처리 과정이 모두 성공했을 때만 그 결과를 반영함
2. 특징 (ACID)
Atomicity 원자성
- 정의: 트랜잭션이 데이터베이스에 모두 반영되든가 아니면 전혀 반영되지 않아야 한다는 것
- 트랜잭션 단위로 데이터가 처리되지 않는다면
👉 데이터 처리 시스템을 이해하기 힘듦
👉 오작동 했을 시 원인을 찾기가 힘듦
Consistency 일관성
- 정의: 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 함
- DB가 변경되더라도 업데이트된 DB로 트랜잭션이 진행되는 것이 X
💡 처음에 트랜잭션을 진행하기 위해 참조한 DB로 진행
Isolation 독립성
- 정의: 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 트랜잭션이라도 다른 트랜잭션의 연산에 끼어들 수 없음
- 하나의 특정 트랜잭션이 완료될 때까지 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없음
Durabiliy 영구성
- 정의: 트랜잭션이 성공적으로 완료됐을 경우, 결과는 영구적으로 반영되어야 함
3. 상태
활성 Active
- 정의: 트랜잭션이 정상적으로 실행중인 상태
- 트랜잭션이 시작되면 해당 트랜잭션의 상태는 활동 상태가 됨
- 설계자가 설계한 대로 연산들이 정상적으로 실행중인 상태를 의미함
성공
- 부분 완료 Partially Committed
: 트랜잭션의 마지막까지 실행되었지만, Commit 연산이 실행되기 직전의 상태- 작업이 성공했다고 해서 무조건 반영하는 것이 아니라, 설계자의 최종 승인이 있을 때까지 실제 DB에 작업 내용을 반영하지 않고 기다리고 있는 상태
- 완료 Committed
: 트랜잭션 성공이 종료되어 Commit 연산을 실행한 후의 상태- 설계자가 작업 결과에 대하여 반영을 승인한다면 트랜잭션이 성공적으로 종료됨
실패
- 실패 Failed
: 트랜잭션 실행에 오류가 발생하여 중단된 상태 - 철회 Aborted
: 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태- 설계되어 있는 트랜잭션 내부의 작업을 다시 수행 이전의 상태로 돌리는 Rollback 연산을 수행한 상태
4. 문법
Commit
- 정의: 모든 작업들을 정상 처리하겠다고확정하는 명령어
- 해당 처리 과정을 DB에 영구 저장
- Commit을 수행하면 하나의 트랜잭션 과정이 종료되는 것. 이전 데이터가 완전히 반영되어 UPDATE 됨
START TRANSACTION; -- 트랜잭션 시작
-- id = 1인 사람의 잔액에서 -500000
UPDATE account set amount = amount - 500000 where id = 1;
-- id = 2인 사람의 잔액에 +500000
UPDATE account set amount = amount - 500000 where id = 2;
-- 이체 이력 저장
INSERT INTO TransferHistory (from_id, to_id, amount, trans_date)
VALUES(1, 2, 500000, now());
COMMIT; -- 트랜잭션을 DB에 적용
-- 적용된 결과 조회
SELECT * from account;
SELECT * from TransferHistory;
Rollback
- 정의: 작업 중 문제가 발생되어 트랜잭션의 처리 과정에서 발생한 변경사항을 취소하는 명령어
- 해당 명령을 트랜잭션에게 하달하면, 트랜잭션은 시작되기 이전의 상태로 돌아감 (= 마지막 Commit을 완료한 시점으로 돌아감)
START TRANSACTION; -- 트랜잭션 시작
INSERT INTO members VALUES('곽', '두팔', '서울시', '강남구', '대한민국');
SELECT * FROM members; -- 변경된 상태 보여줌
ROLLBACK; -- 트랜잭션을 취소하고 START TRANSACTION 실행 전 상태로 롤백함
SELECT * FROM members;
더보기
MYSQL 기본 Commit 방식을 바꿀 수 있음
MYSQL에서는 디폴트로 auto commit이 on으로 설정되어 있음
세미콜론을 찍을 때마다 DB에서 자동으로 commit됨
- 0은 auto commit Off
- 1은 auto commit On
-- 오토커밋 off
SET AUTOCOMMIT = 0;
-- 오토커밋 on
SET AUTOCOMMIT = 1;
-- 오토쿼리 설정 확인
SELECT @@autocommit;
5. Rollback 예외
- 모든 명령어에 대하여 트랜잭션의 롤백 명령이 적용되는 것은 아님
- DDL문(CREATE, DROP, ALTER, RENAME, TRUNCATE)은 대상이 아님
출처
'Computer Science > DB' 카테고리의 다른 글
[DB] 트랜잭션(3) - 격리 수준(Isolation level)과 이상 현상 (0) | 2024.03.14 |
---|---|
[DB] 트랜잭션(2) - 병행 수행과 병행 제어(Concurrency Control) (0) | 2024.03.14 |
스터디 1회차 예상 질문 (0) | 2024.03.11 |
[DB] ERD와 정규화(Normalization) 과정 (0) | 2024.03.11 |
[DB] Key(기본키, 후보키, 슈퍼키, 대체키) (0) | 2024.03.10 |