MySQL(TCL) : COMMIT, ROLLBACK, SAVEPOINT

msung99·2022년 10월 27일
0
post-thumbnail

TCL 이란?

이번 포스팅에서는 트랜젝션 제어어(TCL) 에 대해 알아보겠습니다. 트랜젝션 제어어란 트랜잭션을 제어하는 언어입니다.

트랜잭션 : 데이터베이스의 논리적 연산단위
=> 트랜잭션의 대상이되는 SQL 문은 DML 문입니다.
(UPDATE, INSERT, DELETE 등등)

쉽게말해, TCL이란 데이터 조작어(DML) 명령어를 실행, 취소, 임시저장시 사용하는 명령어입니다.

여기서 DML 이 무엇인지 모르시겠다면 아래의 제 포스팅을 참고하셔도 좋습니다.
https://velog.io/@msung99/MySQL-DML

그리고 TCL 명령어로는 크게 3가지 명령어가 있습니다.
COMMIT, ROLLBACK, SAVEPOINT 명령어가 이에 해당합니다.


COMMIT (커밋)

변경된 데이터를 테이블에 영구적으로 반영하는 것

  • commit 이전 데이터는 영원히 잃어버리게 됩니다.

=> 입력한 자료나 수정한 자료에 대해서 또는 삭제한 자료에 대해서 전혀 문제가 없다고 판단되었을 경우 COMMIT 명령어를 통해서 트랜잭션(DML 명령어 처리)을 완료합니다.

즉, 모든 작업을 정상적으로 처리하겠다고 확정하는 명령어입니다.


ROLLBACK (롤백)

트랜잭션(INSERT, UPDATE, DELETE) 작업 내용을 취소한다.

  • 즉, 데이터 변경사항이 취소되어 데이터의 이전 상태로 복구되며,
    관련된 행에 대한 잠금(Locking) 이 풀리고 다른 사용자들이 데이터 변경을 할 수 있게된다.

  • ROLLBACK 은 데이터 변경 사항이 취소되어 데이터의 이전 상태로 복귀되며, 관련된 행에 잠금(Locking) 이 풀리고 다른 사용자들이 데이터 변경을 할 수 있게 됩니다.

  • 이전 COMMIT 한 곳까지만 복구합니다.

  • 트랜젝션 작업중 하나라도 문제가 발생하면, 모든 작업을 취소해야 함!
    따라서 하나의 논리적인 작업 단위로 구성해 놓는것이 좋다.

    (문제가 발생하면, 논리적인 작업의 단위를 모두 취소해 버리면 되기떄문)


commit 과 ROLLBACK 의 특징

요약
COMMIT 특징

  • 트랜잭션 작업 내용을 실제 DB 에 저장한다.
  • 이전 데이터가 완전히 UPDATE 된다.
  • 모든 사용자가 변경한 데이터의 결과를 볼 수 있다.

ROLLBACK 특징

  • 트랜잭션 작업 내용을 취소한다.
  • 이전 COMMIT 한 곳 까지만 복구한다.

1. COMMIT 이나 ROLLBACK 이전의 데이터 상태

  • commit 이전에는 단지 메모리 Buffer 에만 영향을 받았기 때문에, 데이터 변경 이전 상태로 복구가 가능합니다.

  • 그러나 commit 후에는 변경사항이 DB에 반영되며, 이전 데이터는 영원히 잃어버리게 됩니다.

  • commit 이전에, 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없습니다. (commit 이후에 모든 사용자가 결과를 확인 가능합니다)

  • 현재 사용자는 SELECT 문으로 결과를 확인 가능합니다.

  • 변경된 행은 잠금(Locking) 이 설정되어서, 다른 사용자가 변경 불가능하다.

2. COMMIT 이후의 상태

  • 데이터에 대한 변경 사항이 데이터베이스에 반영됩니다.
  • 이전 데이터는 영원히 잃어버리게 된다!
  • 모든 사용자는 결과를 볼 수 있습니다.
  • 관련된 행이 대한 잠금(Locking) 이 풀리고, 다른 사용자들이 행을 조작할 수 있습니다.

SAVEPOINT (저장점)

  • 저장점(SavePoint) 를 정의하면 롤백(RollBack) 할떄 트랙잭션에 포함된 전체 작업을 롤백하는 것이 아니다, 현 시점에서 SavePoint 까지 트랜잭션의 일부만 롤백할 수 있다.

SAVEPOINT 정의하기

  • 아래는 SVPT1 이라는 저장점(Savepoint) 를 정의하는 방법입니다.
SAVEPOINT SVPT1;

저장점(Savepoint) 으로 롤백(Rollback) 하기

  • ROLLBACK 키워드 뒤에 Savepoint 명을 지정해주면 됩니다.
ROLLBACK TO SVPT1;

예시

  • 저장점 A로 되돌리고(Rollback) 나서 다시 저장점 B와 같은 미래 방향으로 되돌아가는 것(Rollback) 은 불가능!

    • 특정 저장점까지 롤백하면 그 저장점 이후에 설정한 저장점이 존재하지 않게된다
    • 즉, 저장점 A로 롤백하고나면 A 이후에 정의한 저장점 B는 존재하지 않음
  • 저장점을 지정하지 않고 그냥 "ROLLBACK" 를 실행하는 경우, 반영안된 모든 변경사항을 취소하고 트랜잭션 시작 위치로 되돌아간다.

참고 & 출처

https://wikidocs.net/4096
https://mozi.tistory.com/209
https://hoon93.tistory.com/24

profile
https://haon.blog

0개의 댓글