본문 바로가기
DBMS/ORACLE

[ORACLE] 오라클_트랜잭션 명령어( COMMIT | ROLLBACK )

by 썸머워즈 2019. 3. 5.
반응형

트랜잭선(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
반응형


댓글

TOP