트랜잭션(transaction)이란?
한 묶음으로 처리되도록 만든 SQL 명령문들을 묶은 작업 단위
대부분의 의미 있는 서비스 처리를 하려면 SQL 명령문 한번 (SELECT, UPDATE, …)만으로는 어렵다.
계좌이체라는 작업을 예시로 들어보자. 만약 X의 돈을 100 감소시키는 UPDATE 문 직후에 서버가 다운되면 어떻게 될까? 더 이상 서버에선 쿼리문을 날리지 못하니, Y에겐 100만큼의 돈이 가지 않고 회사가 X의 돈을 훔친 꼴이 된다(!).
그리고 갑작스러운 서버 다운, 네트워크 오류, 데이터센터 화재 등 데이터베이스의 일관성을 위협하는 요소들은 생각보다 많다.
이를 해결하기 위해선 계좌이체라는 하나의 처리를 { X 잔고 UPDATE 문, Y 잔고 UPDATE 문 } 한 단위로 묶어서 모두 실행이 끝나야만 정상 처리가 되도록 해야 한다.
트랜잭션 과정중에 하나의 쿼리문이라도 오류가 있으면 전체를 취소(ROLLBACK)해야 한다.
- COMMIT : 트랜잭션의 실행 결과를 데이터베이스에 최종적으로 반영하는 것, 즉 DB가 일관성 있는 상태이므로 정상 종료하겠다는 것
- ROLLBACK : 실행 결과를 반영하지 않고 취소하여 원래 상태로 되돌리는 것
- 실제 트랜잭션 코드
DESC Student; +--------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+-------+ | 학번 | int unsigned | NO | PRI | NULL | | | 주민번호 | char(1) | NO | UNI | NULL | | | 이름 | char(10) | NO | | NULL | | | MBTI | char(4) | YES | | NULL | | | major_id | int unsigned | YES | MUL | NULL | | +--------------+--------------+------+-----+---------+-------+ # 트랜잭션 시작, 아래 명령문들은 하나의 묶음으로 처리됨 START TRANSACTION; INSERT INTO Student values(17001234, '1', '스펀지밥', 'ENFP', 1); UPDATE Student SET MBTI='ENFJ' WHERE 이름='스펀지밥'; SELECT * FROM Student; +----------+--------------+--------------+------+----------+ | 학번 | 주민번호 | 이름 | MBTI | major_id | +----------+--------------+--------------+------+----------+ | 17001234 | 1 | 스펀지밥 | ENFJ | 1 | +----------+--------------+--------------+------+----------+ # 1 row in set (0.00 sec) # 롤백 ROLLBACK; select * from Student; # Empty set (0.00 sec)
- START TRANSACTION; INSERT INTO Student values(18005678,'성욱','INFP'); INSERT INTO Student values(17000000,'진욱','ISTJ'); // 여기까진 성욱, 진욱 존재함 COMMIT; // 성욱, 진욱 데이터 삽입 확정
트랜잭션의 특징 - ACID
Atomicity(원자성)
all or nothing!
트랜잭션 안의 SQL 명령문들은 DB에 모두 반영(COMMIT)되거나, 혹은 전혀 반영되지 않거나(ROLLBACK) 둘 중 하나의 결과만을 낳아야 한다.
Consistency(일관성)
트랜잭션 처리 결과로 DB는 논리적으로 항상 일관성 있어야 한다.
트랜잭션 진행중에 데이터베이스가 변경 되더라도, 업데이트된 데이터베이스로 트랜잭션이 진행되는것이 아니라, 트랜잭션을 진행 하기 위해 처음에 참조한 데이터베이스로 진행된다.
이렇게 함으로써 각 사용자는 일관성 있는 데이터를 볼 수 있게 된다.
Isolation(독립성)
커밋되기 전까지 트랜잭션의 (임시) 실행 결과들은 다른 트랜잭션에게 공개되지 않아야 한다. 같은 데이터를 처리하려는 다른 트랜잭션들의 간섭 방지를 위해서이다.
동시 실행중이며 커밋되지 않은 각 트랜잭션은 변경 내용을 락을 통해 고립시켜 다른 트랜잭션의 접근을 방지한다.
Durability(지속성)
트랜잭션이 성공적으로 완료(커밋)되었으면, 그 결과는 영구적으로 반영되어야 한다.
참고
'CS > DB' 카테고리의 다른 글
[DB 기초] 조인(JOIN) (0) | 2023.09.12 |
---|---|
[DB 기초] 정규화(normalization) (0) | 2023.09.10 |
[DB 기초] DB 인덱스(index) (0) | 2023.03.03 |
[DB 기초] 테이블(Table)과 키(Key), 제약조건(Constraint) (0) | 2023.02.08 |
[DB 기초] 데이터베이스와 RDBMS, SQL (1) | 2023.02.08 |