반응형
트랜잭선(Transaction)
트랜잭션이란 데이터의 처리 단위라고 생각하면 된다.
제목에 맞게 COMMIT을 기준으로 설명을 하자면,
COMMIT이 일어난 시점부터 다음 COMMIT 전까지의 작업이 하나의 트랜잭션이라 생각하면 된다.
그래서 쉽게 말하면 이 트랜잭션 단위에서 발생한 작업을 저장(COMMIT), 되돌리기(ROLLBACK)하는 것이다.
커밋(COMMIT)
예를 하나 들어보자면, 아래와 같이 실행을 했다고 해보자.
INSERT INTO oracleStudy VALUES(3,'TEST1');
SELECT * FROM oracleStudy; -- 아무것도 결과값이 나오지 않는다.
어째서 INSERT를 했는데, SELECT 되는 값이 없을까?
그 이유는 한 트랜잭션 단위에서 작업이라 하면 INSERT(삽입), UPDATE(수정), DELETE(삭제) 등이 있는데,
최종적으로 COMMIT을 해주지 않으면 결과가 테이블에 반영되지 않는다.
실제 겪은 일로 아래와 같은 일이 발생할 수 있다.
SQL Developer 같은 도구를 써서 INSERT, UPDATE, DELETE를 하고 나서 COMMIT을 하지 않았는데도, 적용된 결과를 볼 수 있는 경우가 있다.
하지만 이것은 현재 세션에서만 볼 수 있는 내용이며, 최종적으로 데이터베이스에 반영된 상태가 아니다.
실제로 확인을 해보고자 한다면 SPRING을 이용하여 웹사이트를 만든다 할 때,
간단하게 게시글 리스트를 DB에서 가져와 보여주는 것을 만들어보고 Developer 같은 도구를 써서 INSERT를 해보면 웹상에서는 여전히 목록이 안 나오지만 Developer에서는 SELECT가 되는 아이러니한 상황이 발생한다.
그 뒤에 COMMIT을 해주면 정상적으로 출력되므로 현재 이 도구 내에서 명령어를 실행했을 때 자동 COMMIT인지 아닌지를 확인해 보면 될 것이다.
INSERT INTO oracleStudy VALUES(3,'TEST1');
COMMIT;
SELECT * FROM oracleStudy; -- 3 , TEST1
이런 식으로 COMMIT을 해 저장하면서 트랜잭션이 종료되고 결과가 반영되는 것이다.
따로 예제는 없지만 INSERT 말고도 UPDATE와 DELETE 역시 동일하다.
롤백(ROLLBACK)
ROLLBACK은 이 트랜잭션 작업 단위가 시작한 지점으로 복귀하는 것을 말한다. (이전 상태로 복귀)
DELETE FROM oracleStudy WHERE oralceNo = 3;
SELECT * FROM oracleStudy; -- 아무것도 결과값이 나오지 않는다.
위와 같이 만약 실수로 삭제를 했을 경우, 삭제했는데 취소하고 싶은 경우 또는 잘못 수정했을 경우 ROLLBACK을 사용해 주면 된다.
DELETE FROM oracleStudy WHERE oralceNo = 3;
ROLLBACK;
SELECT * FROM oracleStudy; -- 3, TEST1
하지만 하나 주의할 점은 COMMIT을 해주고 나서 ROLLBACK을 해봤자 결과는 돌아오지 않는다는 점이다.
COMMIT은 완료라는 의미가 강하기 때문에 COMMIT을 하기 전에 ROLLBACK을 해야 한다.
우리가 처리해주지 않아도 자동으로 COMMIT , ROLLBACK 되는 경우가 있다.
* 자동 COMMIT : 데이터 정의어(CREATE, ALTER, DROP) , 데이터 제어어(GRANT, REVOKE)
* 자동 ROLLBACK : 비정상적인 종료, SYSTEM FAILURE
반응형
댓글