예전에
http://88240.tistory.com/entry/MYSQL-SET-AUTOCOMMIT-FALSE
근데 내용이 부실해,
그리고 추가로
다시 포스팅한다.
우선
데이터를 삽입, 수정, 삭제 (
하지만, 실수를 해서 전 상태로 돌리고 싶을 때가 있다.
이때
예를 들어 TEMP_TABLE 에 있는 USER_NAME 이 SHAKING 인 사용자의 SITE_URL을 '88240.tistory.com' 로
이때 USER_NAME 이 SHAKING 인 사용자가 너무 많고,
여러개를 한꺼번에
그리고나서 모든 데이터가
그렇다면 얼마전에 공부하다 알게됐다는
위와 같이
(물론,
예를 들어
1. TEMP_TABLE 에 있는 USER_NAME 이 A로 시작하는 사용자의 SITE_URL을 '88240.tistory.com' 로
2. TEMP_TABLE 에 있는 USER_NAME 이 B로 시작하는 사용자의 SITE_URL을 '88240.tistory.com' 로
3. TEMP_TABLE 에 있는 USER_NAME 이 C로 시작하는 사용자의 SITE_URL을 '88240.tistory.com' 로
이처럼
각각
그리고나서 모든 데이터가
세개의 모든
세번째
참고사이트 : http://stackoverflow.com/questions/1294372/savepoint-commit-rollback-in-mysql
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