트랜잭션(TRANSACTION)
- 데이터베이스의 논리적인 작업 단위
- DBMS 는 데이터들의 변경사항(DML)들을 모두 하나의 트랜잭션으로 묶어 두었다가
TCL문에 의해 실제 데이터베이스에 모두 반영되거나 모두 취소처리 된다( ALL OR NOTING)1) COMMIT ( 확정 ) : 변경사항을 DB상에 확정 하는 명령어
2) ROLLBACK(취소) : 트랜잭션에 담겨있는 변경사항을 실제 DB에 반영하지 않고 취소시키는 명령어
3) SAVEPOINT 포인트명 : 현재 시점을 임시저장시점을로 만드는 예약어
4) ROLLBACK 포인트명 : 전체 변경사항들을 취소하는것이 아니라 포인트 지점까지의 변경사항들만 취소 시키는 명령어.
- ACID는 데이터베이스 트랜잭션의 네 가지 주요 속성의 약어이다
- 각 속성은 데이터베이스의 신뢰성과 무결성을 보장
원자 : 물질을 구성하는 최소단위
- 더이상 작업단위를 나눌수 없다.
- 트랜잰션들은 모두 하나로 묶어서 처리.(전체 COMMIT, 전체 ROLLBACK)
- 트랜잭션 내부 작업을 COMMIT, ROLLBACK 으로 나누어 처리 할 수 없다
- 트랜잭션 내의 모든 작업이 성공적으로 완료되거나, 전혀 수행되지 않아야 합니다.
- 즉, 트랜잭션이 실패하면 모든 변경 사항이 원래 상태로 되돌려져야 합니다.
-- EMP01 테이블 생성
CREATE TABLE EMP_01
AS SELECT EMP_ID, EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID;
SELECT * FROM EMP_01; --23명 조회 완료
-- 900번 사원 삭제
DELETE FROM EMP_01
WHERE EMP_ID = 900;
-- 214번 사원 삭제
DELETE FROM EMP_01
WHERE EMP_ID = 214;
SELECT * FROM EMP_01; -- 21명 조회
ROLLBACK; --사원 삭체 처리과정을 나누어 구분이 불가능 복구 작업은 동시에 이루어진다.
SELECT * FROM EMP_01; -- 23명 조회
- 트랜잭션이 실행 될 떄 그 실행결과로 인해 데이터베이스의 일관성을 유지하는 속성.
데이터베이스의 일관성
- 데이터가 일관된(올바른)상태를 유지함을 의미
- 데이터베이스가 일관성을 유지하는것은 데이터가(칼럼) 정의된 제약 조건 준수를 의미한다
-DB의 구조상 문제가 없는데 트랜잰션이 실행 후 문제가 발생 한다면 일관성이 없다고 할 수 있다- 트랜잰션의 결과값으로 객체구조의 일관성이 깨지지 않는다 (트랜잰션의 일관성)
- 트랜잭션이 실행되기 전과 후에 데이터베이스는 일관된 상태여야 한다
- 트랜잭션이 완료된 후, 데이터는 정의된 규칙과 제약조건을 만족해야 한다.
-- 제약조건이 없어 그대로 행추가 되었다
INSERT INTO EMP_01 VALUES(200, '선동일부캐', '총무부');
ROLLBACK;
-- EMP_ID 칼럼에 PK제약조건추가
ALTER TABLE EMP_01 ADD CONSTRAINT EMP_01_ID_PK PRIMARY KEY(EMP_ID);
INSERT INTO EMP_01 VALUES(200, '선동일부캐', '총무부');
--제약조건으로 인하여 오류 발생
COMMIT;
-- 제약조건과 상관없는 값을 입력하면 문제 없시 행추가가 된다.
ALTER TABLE EMP_01 ADD CONSTRAINT EMP_01_ID_PK PRIMARY KEY(EMP_ID);
INSERT INTO EMP_01 VALUES(300, '선동일부캐', '총무부');
--제약조건으로 인하여 오류 발생
COMMIT;
SELECT * FROM EMP_01;
- 서로 다른 세션에서 동시에 여러 트랜잰션이 실행 될 경우 각 트랜잰션이 서로의 작업에
영향을 끼치지 않고 독립적 실행이 보장되는 속성.- 동시에 실행되는 트랜잭션은 서로 독립적으로 실행
- 하나의 트랜잭션이 실행되는 동안 다른 트랜잭션은 그 결과를 볼 수 없다(데이터 불일치 방지)
- 한번 반영된(COMMIT, ROLLBACK)된 트랜잭션은 DBMS에 "영구" 반영되도록 보장하는 속성
- 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 저장되어야 한다
- 시스템 오류가 발생하더라도 데이터는 손실되지 않아야 한다.
-- 사번이 200번인 사원삭제
DELETE FROM EMP_01
WHERE EMP_ID = 200;
--사번이 800번, 홍길동, 총무부인 사원 추가
INSERT INTO EMP_01 VALUES(800, '홍길도', '총무무');
SELECT * FROM EMP_01;
COMMIT;
--SAVEPOINT , ROLLBACK TO 이름
SELECT * FROM EMP_01; -- 25명 조회
--EMP_01 테이블에서 사번이 217, 216, 214인 사원만 삭제
DELETE FROM EMP_01
WHERE EMP_ID IN ( 217, 216, 214) ;
--3명 삭제 시점을 SAVEPOINT로 지정
SELECT * FROM EMP_01; -- 22명 조회
SAVEPOINT SP1;
--EMP_01 테이블에 사번 809, 임세윤, 인사부
INSERT INTO EMP_01 VALUES (809, '임세윤', '인사부'); --1행추가
INSERT INTO EMP_01 VALUES (810, '최윤성', '인사부'); --2행추가
SELECT * FROM EMP_01; -- 24명 조회
ROLLBACK TO SP1;
SELECT * FROM EMP_01; -- 22명 조회 된다
COMMIT; -- 커밋까지 해야 더이상 트랜잭션이 남아 있지 않는다
- DDL 구문을 실행하는 순간 자동적으로 COMMIT이 수행
- 기존 트랜잭션에 있던 변경사항 중 픽스(COMMITM ROLLBACK)되지 않는
- 변경 사항이 있다면 명확히 수행한 후 DDL 실행해야 한다.
DELETE FROM EMP_01
WHERE EMP_ID = 900; --자료가 없더라도 에러가 아니 0개행 삭제라는 문구가 나온다
SELECT * FROM EMP_01; --21명 조회
--테이블 생성
-- 자동 COMMIT 실행
CREATE TABLE TEST(
TID NUMBER
);
-- 자동 COMMIT 실행 되었다
SELECT * FROM EMP_01;
ROLLBACK;
SELCET * FROM EMP_01; 21명 롤백이 되지 않았다