본문으로 바로가기

[MYSQL] SAVEPOINT

category Helloworld!/MySql 2016. 7. 6. 14:18
예전에 SET AUTOCOMMIT에 대해서 포스팅한 적이 있다.
http://88240.tistory.com/entry/MYSQL-SET-AUTOCOMMIT-FALSE
근데 내용이 부실해,
그리고 추가로 SAVEPOINT에 대해 얼마전에 공부했어가지고...
다시 포스팅한다.

우선
데이터를 삽입, 수정, 삭제 (INSERT, UPDATE, DELETE) 와 같은 DML 명령어들을 실행을 하면 대부분 AUTO COMMIT이 기본으로 켜져 있어서 바로바로 데이터가 적용된다.
하지만, 실수를 해서 전 상태로 돌리고 싶을 때가 있다.
이때 AUTO COMMIT을 끄면 바로 적용이 안될 뿐 더러 ROLLBACK이라는 명령어로 INSERT, UPDATE, DELETE 명령어를 진행하기 전 상태로 돌릴 수가 있다.

DML (Data Manipulation Language) 이란?
DML은 데이터를 조작(선택, 삽입, 수정, 삭제)하는 데 사용되는 언어이다.
SQL문 중에 SELECT, INSERT, UPDATE, DELETE가 이 언어에 해당하며, 트랜잭션(Transaction)이 발생하는 SQL도 이 DML이다.
트랜잭션을 쉽게 표현하면, 테이블의 데이터를 변경(입력/수정/삭제)할 때 실제 테이블에 완전히 적용하지 않고, 임시로 적용시키는 것을 말한다.

예를 들어 TEMP_TABLE 에 있는 USER_NAME 이 SHAKING 인 사용자의 SITE_URL을 '88240.tistory.com' 로 UPDATE 하려고 한다.
이때 USER_NAME 이 SHAKING 인 사용자가 너무 많고,
여러개를 한꺼번에 UPDATE를 하다보니 시간이 오래 걸려 중간에 끊기거나 잘못 수정해서 다시 수정하기 전 상태로 돌리고 싶어질지도 모르니까 바로 UPDATE문이 적용되지 않도록 하고싶다.
#AUTO COMMIT 끔
SET AUTOCOMMIT = FALSE;

#TRANSACTION 시작
START TRANSACTION;

#UPDATE 진행
UPDATE TEMP_TABLE SET SITE_URL = '88240.tistory.com' WHERE USER_NAME = 'SHAKING'

그리고나서 모든 데이터가 UPDATE를 제대로 진행 했을 경우
COMMIT

UPDATE 하기전으로 돌리고싶다면
ROLLBACK
을 하면 된다.

그렇다면 얼마전에 공부하다 알게됐다는 SAVEPOINT는 어떨때 쓰냐인데
위와 같이 UPDATE를 한번만 쓰는게 아니라 UPDATE를 다른 조건으로 여러번 쓰게 될 경우 각 UPDATE문에 SAVEPOINT를 줘서 ROLLBACK 할 부분을 구분할 때 사용한다.
(물론, INSERT, DELETE도 됨)

예를 들어
1. TEMP_TABLE 에 있는 USER_NAME 이 A로 시작하는 사용자의 SITE_URL을 '88240.tistory.com' 로 UPDATE 하려고 한다.
2. TEMP_TABLE 에 있는 USER_NAME 이 B로 시작하는 사용자의 SITE_URL을 '88240.tistory.com' 로 UPDATE 하려고 한다.
3. TEMP_TABLE 에 있는 USER_NAME 이 C로 시작하는 사용자의 SITE_URL을 '88240.tistory.com' 로 UPDATE 하려고 한다.

이처럼 WHERE 조건이 다른 UPDATE 쿼리문을 실핼하려 할 경우
각각 SAVEPOINT를 넣어주면 다음과 같다.
#AUTO COMMIT 끔
SET AUTOCOMMIT = FALSE;

#TRANSACTION 시작
START TRANSACTION;

#UPDATE 진행
SAVEPOINT A;
UPDATE TEMP_TABLE SET SITE_URL = '88240.tistory.com' WHERE USER_NAME LIKE 'A%'

SAVEPOINT B;
UPDATE TEMP_TABLE SET SITE_URL = '88240.tistory.com' WHERE USER_NAME = 'B%'

SAVEPOINT C;
UPDATE TEMP_TABLE SET SITE_URL = '88240.tistory.com' WHERE USER_NAME = 'C%'

그리고나서 모든 데이터가 UPDATE를 제대로 진행 해서 변경을 적용하고 싶다면 역시나
COMMIT

세개의 모든 UPDATE 문을 취소하고싶다면 (즉, 전체취소)
ROLLBACK

세번째 UPDATE 만 실행하고 싶다면 다음과 같이 SAVEPOINT를 사용하면 된다.
ROLLBACK TO SAVEPOINT C
그러면 UPDATE C 하기 전 상태로 돌아간다.

참고사이트 : http://stackoverflow.com/questions/1294372/savepoint-commit-rollback-in-mysql