개요와 목적
이번 글에서는 DB의 무결성을 보장해주는 트랜잭션의 개념에 대해서 알아본다.
그리고, 무결성을 보장하는 트랜잭션의 특징인 ACID에 대해서도 알아본다.
Transaction
트랜잭션이란, 명령어들이 뭉쳐진 하나의 작업 덩어리를 의미한다. 분할 할 수 없는, 작업 덩어리라고 말할 수 도 있다. 예시를 통해, 분할 되어서는 안 되는 작업 덩어리가 무엇인지 알아보자.
은행 서비스를 이용해, 월세를 지불하는 상황이다. → 먼저 세입자 통장에서 월세 60만원이 인출 된다. → 집주인 통장으로 60만원이 입금 된다. 그런데, 만약 60만원 인출 작업만 성공하고, 입금 작업은 실패한다면, 허공에 돈이 날아가는 문제가 발생한다.
즉 60만원 인출과 60만원 입금은 동시에 성공하던지, 동시에 실패 해야 하는, 분할 할 수 없는 작업 덩어리이다. 이 두 과정을 동시에 묶는 것을 트랜잭션이라고 한다.
즉 데이터베이스의 뭉쳐진 데이터 거래 과정에서 안정성을 확보하기 위한 방법이 트랜잭션이다. 데이터 베이스의 (데이터 읽기, 수정이나 삭제) 뭉쳐진 과정에서 오류가 발생하면, 모든 각 과정을 복구하고, 모두 성공 했을 때만, 결과를 반영한다.
모든 작업이 성공해서 데이터베이스에 정상 반영하는 것을 커밋( Commit )이라 하고, 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것을 롤백( Rollback )이라 한다.
세션에 대해 이해하기
트랜잭션이 이루어지는 단위인 세션에 대해서 알아보자.
클라이언트(어플리케이션 서버, DB 툴)은 데이터베이스 서버에 접근할 수 있다. 클라이언트는 데이터베이스 서버에 연결을 요청하고 커넥션을 맺게 된다. 이 때 각 커넥션마다 DB 내부에서 세션을 만든다. 그리고 앞으로 해당 커넥션을 통한 모든 요청은 이 세션을 통해서 실행하게 된다. 세션은 트랜잭션을 시작하고, 커밋 또는 롤백을 통해 트랜잭션을 종료한다. 그리고 이후에 새로운 트랜잭션을 다시 시작할 수 있다. 사용자가 커넥션을 닫거나, 또는 DBA(DB 관리자)가 세션을 강제로 종료하면 세션은 종료된다
커넥션 풀에서 10개의 커넥션 생성 한다면, 세션도 10개 만들어진다.
MySQL과 Transaction
MySQL에서 트랜잭션이란, Commit을 수동으로 바꾸는 설정 작업이다.
기본 설정은 INSERT, DELETE, UPDATE 중 하나의 명령문을 사용하여, 데이터를 바꿀 때는, 자동으로 Commit이 실행되어, 결과가 반영된다.
Commit 설정을 수동으로 바꾸게 되면, 트랜잭션 안에 여러 개의 명령을 넣어 결과를 만들어 낼 수 있다.
사용 방법
- auto commit 확인하기
SELECT @@AUTOCOMMIT;
0인 경우 자동 Commit 설정이다.
1인 경우 수동 Commit 설정이다.
- 원하는 Commit을 설정하기
자동 commit 설정(쿼리 실행할 때마다 커밋)
SET AUTOCOMMIT = TRUE;
수동 commit 설정
SET AUTOCOMMIT = FALSE;
- 수동 Commit 트랜잭션 시작하기
트랜잭션 시작을 표시한다.
START TRANSACTION;
데이터 베이스에 결과 적용.
COMMIT;
트랜잭션 명령어 취소 결과 미 반영.
ROLLBACK;
주의사항
DDL문(CREATE, DROP, ALTER, RENAME, TRUNCATE)은 transaction의 rollback 대상이 아니다.
ACID의 의미
트랜잭션은 데이터 처리 과정의 안정성을 보장한다. ACID는 트랜잭션이 보장해야하는 요소들이다. 원장성, 일관성, 격리성, 지속성.
원자성 (Atomicity)
원자성이란, 트랜잭션내에서 실행한 작업들은 마치 하나의 작업인 것처럼 데이터 베이스에 모두 반영되거나, 모두 반영되지 않아야 한다.
일관성 (Consistency)
일관성이란, 트랜잭션이 일어난 이후에도, 기존의 데이터베이스 제약이나 규칙을 만족해야 한다는 것이다.
예를 들어, 기존의 데이터는 삭제하지 않아야 한다는 데이터베이스 제약이 있다. 그런데 하나의 트랜잭션안에 (1. 고객을 추가한다. 2. 고객을 삭제한다.) 라는 명령일 때, 규칙을 깨뜨리기 때문에, 일관성을 유지하기 위해 허용하지 않는다.
독립성 (Isolation)
독립성이란, 트랜잭션이 두 개 이상 실행될 때, 트랜잭션 끼리 영향을 주지 못 하는 것이다.
영구성 (Durability)
영구성이란, Commit된 트랜잭션 결과는 영구적으로 DB에서 반영되는 것이다.
Reference
https://inpa.tistory.com/entry/MYSQL-📚-트랜잭션Transaction-이란-💯-정리
'Web Sever 개발과 CS 기초 > DB 지식' 카테고리의 다른 글
DB Isolation Level 격리 수준 이해하기 (0) | 2022.10.01 |
---|---|
데이터베이스 구성 요소와 키(PK, FK)에 대한 이해 (0) | 2022.10.01 |
DB Index 이해하기 (0) | 2022.10.01 |
SQL 언어 DML, DDL, DCL, TCL 이해하기 (0) | 2022.09.24 |
RDBMS 관계형 데이터 베이스 이해하기 (0) | 2022.09.24 |