-
TCL(Transaction Control Language) in MySQLComputer Science/Database 2021. 9. 17. 22:28
DBMS에서 사용할 수 있는 SQL Commands는 크게
- DDL(Data Definition Launguage): 데이터베이스, 테이블을 제어
- DML(Data Manipulation Launguage): 테이블 내 데이터의 검색/등록/삭제/갱신의 연산 제어
- DCL(Data Control Launguage): 데이터베이스에 접근할 때의 권한을 제어
- TCL(Transaction Control Launguage): 논리적 작업 단위인 트랜잭션에 관한 연산을 제어
로 나뉜다.
대표적인 RDBMS인 MySQL에서의 TCL 연산을 직접 수행해보고 이해해보자
TCL 연산
- COMMIT: 트랜잭션 내의 변경 사항을 영속적으로 데이터베이스에 반영한다
- ROLLBACK: SAVEPOINT 혹은 마지막 커밋 시점으로 데이터베이스의 상태를 되돌린다
- SAVEPOINT: 트랜잭션의 수행 도중 실패가 일어나 취소되거나, ROLLBACK 연산을 직접 수행했을 때 해당 시점으로 돌아가기 위한 체크포인트(해당 트랜잭션 내에서만 존재한다)
- SET TRANSACTION: 트랜잭션을 명시적으로 시작한다
Table DDL
drop table if exists test; create table test( num int not null );
int형 데이터타입의 'num'이라는 컬럼을 가진 테이블을 생성한다
Transaction 예시
start transaction; insert into test values(2); savepoint p2; insert into test values(3); insert into test values(4); savepoint p4; insert into test values(5); insert into test values(6); # rollback to p2; -> 1번 TCL # rollback to p4; -> 2번 TCL commit; select * from test;
savepoint p2까지는 {2}라는 데이터가, savepoint p4까지는 {2,3,4}라는 데이터가, commit 시점까지는 {2,3,4,5,6}이라는 데이터가 저장되었을 것이다
주석을 하나씩 해제해보면서 테이블의 상태가 어떻게 되는지 관찰해보자
1️⃣ 1번 TCL의 주석을 해제했을 때
SAVEPOINT p2 시점으로 테이블의 상태가 돌아간다
트랜잭션의 시작 이후 "insert into test values(2);" 만 실행된 상태라서 테이블에는 {2}만 들어있다
2️⃣ 2번 TCL의 주석을 해제했을 때
SAVEPOINT는 p2, p4가 저장되어 있다. p4 시점으로 테이블 상태가 돌아가면 {2, 3, 4}가 insert된 상태를 확인할 수 있다.
3️⃣ 1, 2번 TCL의 주석을 둘 다 해제했을 때
SAVEPOINT p2 시점으로 이동하면 p4는 존재하지 않아서 그 다음 줄을 실행하면 오류가 발생한다
4️⃣ 1, 2번 TCL의 주석을 둘 다 해제하고 위치를 서로 바꾸었을 때
SAVEPOINT p4시점으로 이동한 뒤 p2시점으로 이동하면 1번 테스트 결과와 동일하다.
5️⃣ 1, 2번 TCL의 주석을 둘 다 해제하지 않았을 때
{2,3,4,5,6}의 insert가 수행되고 commit을 실행한다. 트랜잭션이 종료된 뒤 select를 수행한 모습이다.
SAVEPOINT의 Life Cycle
drop table if exists test; create table test( num int not null ); start transaction; insert into test values(0); savepoint p0; insert into test values(1); commit; start transaction; insert into test values(2); savepoint p2; insert into test values(3); insert into test values(4); savepoint p4; insert into test values(5); insert into test values(6); rollback to p0; commit; select * from test;
두 개의 트랜잭션을 순차적으로 실행한 테스트이다.
첫 번째 트랜잭션에서는 p0라는 SAVEPOINT를 지정하고 {0, 1}의 데이터를 저장한 뒤 커밋했고
두 번째 트랜잭션에서는 p2, p4라는 SAVEPOINT를 지정하고 {2, 3, 4, 5, 6}의 데이터를 저장했다.
이 상황에서 두 번째 트랜잭션 수행 도중 p0로 ROLLBACK을 시도하면 {0}만 저장된 데이터베이스 상태로 돌아갈 수 있을까?
돌아갈 수 없다.
SAVEPOINT는 해당 트랜잭션이 수행되는 도중에만 저장되고, 트랜잭션이 종료되고 나면 모두 삭제된다.
'Computer Science > Database' 카테고리의 다른 글
Engine=InnoDB는 뭘 지정해주는 걸까 - MySQL 엔진과 스토리지 엔진 (0) 2023.07.09 동시성 제어 메커니즘 - 낙관적 락, 비관적 락 (400) 2021.12.07 DB의 비정상 수행을 유발하는 SQL Injection을 예방하기 (432) 2021.10.31 데이터의 효율적 검색을 돕는 Index (442) 2021.07.10 Transaction은 논리적 작업 단위의 집합이다 (418) 2021.07.06