오라클에서의 트랜잭션
오라클에서의 트랜잭션의 완료&복귀
DML (data manipulation language) : select, insert, delete, update 등 테이블에 대한 읽기/쓰기 연산으로 구성
DDL (data definition language) : create table, drop table 등 데이터베이스 스키마의 변경에 관한 명령
DCL (data control language) : grant, revoke 같은 권한 관련 명령어
DDL => 자동완료. 하나의 명령문 끝나면 자동으로 트랜잭션 완료된 것으로 처리. DDL문 성공적으로 실행 끝나면 복귀 불가능. (예로, drop table로 테이블 삭제했으면 백업한 데이터가 존재하지 않는 한 삭제된 테이블에 대한 복구 불가)
DCL => DDL과 같은 방식으로, 하나의 명령이 실행되면 그 명령은 자동 완료됨
DML : 오라클에서 트랜잭션에 대한 시작&끝 명시하는 명령어는 없음. 일련의 DML 연산들이 실행된 후에 지금까지의 연산 결과 완료하고 싶으면 commit 명령 이용하고, 복귀할 땐 rollback 명령 사용
- commit : 트랜잭션이 성공적으로 완료된 것. 그 이후 실행되는 다른 연산들은 새로운 트랜잭션 구성함.
- rollback : 트랜잭션 실행 도중 문제 발생해 복귀할 때 사용. rollback이 이뤄지는 범위는 트랜잭션의 새로운 시작을 나타내는 가장 최근의 commit 명령 지점임!
자동 완료 & 자동 복귀
오라클에선 프로그램이 정상적으로 종료되면 트랜잭션은 자동으로 완료됨 (DDL, DCL은 항상 자동완료!)
*quit/exit : 실행했던 문장들 자동으로 commit한 후 빠져나옴
비정상적으로 종료할 경우(commit 실행 안 하는 경우 등등)엔 자동으로 복귀됨 (이전의 상태로!)
*commit 실행 안 해도 정상 종료되면 트랜잭션도 자동 완료됨
set autocommit on : 각각의 DML명령문을 실행할 때 마다 자동으로 완료하라는 명령. 이 명령 후에 rollback 명령으로 복귀 시작해도, 복귀 되지 x (자동으로 명령문 완료됐으므로!)
● 트랜잭션이 자동 완료 되는 경우
- SQL*Plus가 정상적으로 종료하면 트랜잭션은 자동 완료됨
- DDL, DCL 명령 실행하면 현재 트랜잭션은 자동 완료됨
- set autocommit on 설정하면 이후의 개별 DML 명령들은 자동 완료됨
트랜잭션의 고립성 확인 : 1번창, 2번창에서 동시에 트랜잭션을 실행한다고 가정했을 때, 1번창에서 명령문을 실행하고 commit을 실행하지 않았을 땐 2번창에서 갱신된 결과를 읽지 못 함 (1번창에서 실행 중인 트랜잭션이 완료되지 않았기 떄문에! 트랜잭션의 조건 중 고립성을 동시성 제어로 구현한 결과임)
저장점(savepoint) : 오라클에서 하나의 트랜잭션을 분할해 트랜잭션의 일부만을 복귀시키는 수단
하나의 트랜잭션이 많은 명령문으로 구성될 때, 트랜잭션 전체를 복귀하기엔 부담이 크니까, 그 중 일부 구간만을 복귀시킴으로써 데이터베이스의 효율적인 운영에 도움줌
● savepoint <저장점이름> : 저장점을 지정
● rollback to <저장점이름> : 트랜잭션 실행 도중 저장점으로 복귀하고 싶은 경우에 사용.