[Oracle] 23.트랜잭션


트랜잭션



이번 장에서는 트랜잭션에 대해 알아보겠습니다!

트랜잭션(transaction)은 하나의 작업을 수행하기 위해 필요한 데이터베이스의 연산들을 모아놓은 것으로,

데이터베이스에서 논리적인 작업의 단위가 됩니다.



일반적으로 데이터베이스는 SQL문을 사용하므로 트랜잭션은 SQL의 묶음이라고 생각하셔도 됩니다.

그리고 DML (INSERT,DELETE,UPDATE)로만 구성되어 있습니다.



트랜잭션은 ALL or Nothing 방식으로 처리되는데,

트랜잭션 안의 SQL문들이 모두 정상적으로 처리된 후에야 데이터베이스에 실제로 반영시키는 COMMIT,

트랜잭션 안의 SQL문 중 하나라도 정상적으로 처리 안되면

아예 트랜잭션 시작 전으로 되돌아가는 ROLLBACK 으로 트랜잭션을 제어합니다.



하나의 트랜잭션은 COMMIT 된 시점부터 다음 COMMIT할 시점까지를 말합니다.

다음은 트랜잭션의 장점입니다.


  • 데이터 무결성이 보장된다



  • 영구적인 변경 전에 데이터의 변경 사항을 확인할 수 있다.



  • 논리적으로 연관된 작업을 그룹화할 수 있다.



그리고 트랜잭션은 DML로만 구성되어 있다고 했습니다.

그렇다면 왜 DDL과 DCL은 트랜잭션의 구성요소가 될 수 없을까요?

DDL문과 DCL문은 실행됨과 동시에 자동으로 COMMIT되기 때문입니다!



다음은 자동으로 COMMIT , ROLLBACK 되는 경우입니다.


  • SQL PLUS가 정상종료 되었을 때: 자동 COMMIT, 비정상 종료 되었을 때: 자동 ROLLBACK



  • DDL과 DCL 명령문이 수행된 경우: 자동 COMMIT



  • 정전 발생이나 컴퓨터 비정상 종료: ROLLBACK



트랜잭션은 정말 중요하고 유용합니다!

예를 들어 실수로 부서번호 20번인 사원을 삭제하려 했으나 모두 삭제해버린 경우,

COMMIT이 되지않았으면 ROLLBACK으로 명령하기 전으로 돌아갈 수 있습니다!

실습을 통해 알아보죠!

트랜잭션 실습



실습 전에 다음과 같은 emp02 테이블을 생성하겠습니다!


CREATE TABLE EMP02
AS
SELECT employee_id "사원번호", first_name||' '||last_name "사원이름", department_id "부서번호"
FROM employees
WHERE 1=0;




image



COMMIT



COMMIT은 트랜잭션 실행의 결과를 데이터베이스에 영구적으로 반영시키는 작업입니다.

다음과 같이 데이터를 넣으면,


INSERT INTO EMP02 VALUES(1,'KOO',10);




Developer 질의 결과는 다음과 같이 데이터가 들어갔지만,


image



실제 데이터베이스에 반영이 된것이 아닙니다!

그래서 다른 계정으로 EMP02를 조회해보면 데이터가 없다고 나옵니다.

따라서 데이터베이스에 영구적으로 반영하려면 COMMIT 명령어를 사용해야합니다.


INSERT INTO EMP02 VALUES(1,'KOO',10);
COMMIT; --데이터베이스에 영구적으로 반영



ROLLBACK



이번에는 rollback에 대해 알아보죠!

실수로 다음과 같이 테이블에 있는 데이터를 모두 삭제했습니다.


DELETE FROM emp02;



이럴 때 COMMIT이 되지 않았으므로 ROLLBACK 하면 다시 삭제하기 전으로 돌아갑니다.


ROLLBACK;



SAVEPOINT



SAVEPOINT는 롤백할 수 있는 POINT를 지정해 놓는 것입니다.

일단 다음과 같이 emp02 테이블에 데이터가 있다고 합시다.


image



그리고 SAVE POINT를 다음과 같이 설정하겠습니다.


DELETE FROM emp02
WHERE
    부서번호 = 10;

COMMIT;

DELETE FROM emp02
WHERE
    부서번호 = 20;

SAVEPOINT C1;

DELETE FROM emp02
WHERE
    부서번호 = 30;

SAVEPOINT C2;

DELETE FROM emp02
WHERE
    부서번호 = 40;



위의 SQL문을 모두 실행하고 다음과 같이 롤백해보겠습니다.


ROLLBACK;




image



COMMIT 이후로 돌아가는 것을 볼 수 있습니다~


다음과 같이 지정된 SAVEPOINT로 롤백할 수 있습니다.


--ROLLBACK; 하지 않았다고 가정
ROLLBACK TO C1;




image



지정된 SAVEPOINT C1 이후로 돌아가는 것을 볼 수 있습니다.

하지만, 그렇다고 해서 COMMIT 시점과 C1 사이의 시점이 COMMIT 되는 것은 아닙니다!

그래서 다시 ROLLBACK을 하면 이전 COMMIT 이후로 돌아갑니다!

SAVEPOINT C2 이후로도 돌아갈 수 있습니다!


--ROLLBACK TO C1; 하지 않았다고 가정
ROLLBACK TO C2;




image