이번 포스팅에서는 트랜젝션 제어어(TCL) 에 대해 알아보겠습니다. 트랜젝션 제어어란 트랜잭션을 제어하는 언어입니다.
트랜잭션 : 데이터베이스의 논리적 연산단위
=> 트랜잭션의 대상이되는 SQL 문은 DML 문입니다.
(UPDATE, INSERT, DELETE 등등)
쉽게말해, TCL이란 데이터 조작어(DML) 명령어를 실행, 취소, 임시저장시 사용하는 명령어입니다.
여기서 DML 이 무엇인지 모르시겠다면 아래의 제 포스팅을 참고하셔도 좋습니다.
https://velog.io/@msung99/MySQL-DML
그리고 TCL 명령어로는 크게 3가지 명령어가 있습니다.
COMMIT, ROLLBACK, SAVEPOINT 명령어가 이에 해당합니다.
변경된 데이터를 테이블에 영구적으로 반영하는 것
- commit 이전 데이터는 영원히 잃어버리게 됩니다.
=> 입력한 자료나 수정한 자료에 대해서 또는 삭제한 자료에 대해서 전혀 문제가 없다고 판단되었을 경우 COMMIT 명령어를 통해서 트랜잭션(DML 명령어 처리)을 완료합니다.
즉, 모든 작업을 정상적으로 처리하겠다고 확정하는 명령어입니다.
트랜잭션(INSERT, UPDATE, DELETE) 작업 내용을 취소한다.
- 즉, 데이터 변경사항이 취소되어 데이터의 이전 상태로 복구되며,
관련된 행에 대한 잠금(Locking) 이 풀리고 다른 사용자들이 데이터 변경을 할 수 있게된다.
ROLLBACK 은 데이터 변경 사항이 취소되어 데이터의 이전 상태로 복귀되며, 관련된 행에 잠금(Locking) 이 풀리고 다른 사용자들이 데이터 변경을 할 수 있게 됩니다.
이전 COMMIT 한 곳까지만 복구합니다.
트랜젝션 작업중 하나라도 문제가 발생하면, 모든 작업을 취소해야 함!
따라서 하나의 논리적인 작업 단위로 구성해 놓는것이 좋다.
(문제가 발생하면, 논리적인 작업의 단위를 모두 취소해 버리면 되기떄문)
요약
COMMIT 특징
- 트랜잭션 작업 내용을 실제 DB 에 저장한다.
- 이전 데이터가 완전히 UPDATE 된다.
- 모든 사용자가 변경한 데이터의 결과를 볼 수 있다.
ROLLBACK 특징
- 트랜잭션 작업 내용을 취소한다.
- 이전 COMMIT 한 곳 까지만 복구한다.
commit 이전에는 단지 메모리 Buffer 에만 영향을 받았기 때문에, 데이터 변경 이전 상태로 복구가 가능합니다.
그러나 commit 후에는 변경사항이 DB에 반영되며, 이전 데이터는 영원히 잃어버리게 됩니다.
commit 이전에, 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없습니다. (commit 이후에 모든 사용자가 결과를 확인 가능합니다)
현재 사용자는 SELECT 문으로 결과를 확인 가능합니다.
변경된 행은 잠금(Locking) 이 설정되어서, 다른 사용자가 변경 불가능하다.
SAVEPOINT SVPT1;
ROLLBACK TO SVPT1;
저장점 A로 되돌리고(Rollback) 나서 다시 저장점 B와 같은 미래 방향으로 되돌아가는 것(Rollback) 은 불가능!
https://wikidocs.net/4096
https://mozi.tistory.com/209
https://hoon93.tistory.com/24