1장_4절. TCL(Transaction Control Language : 트랜잭션 제어어)

4절. TCL(Transaction Control Language:트랜잭션 제어어)
1.트랜잭션 개요
-트랜잭션은 db의 논리적 연산단위로서 분리될 수 없는 한 개 이상의 데이터베이스 조작flow이다.
-하나의 트랜잭션에는 하나이상의 sql질의 문장이 포함된다.
step1. 100번 계좌에서10,000원 인출
step2. 100번 계좌에 10,000원을 입금
-step1과 2모두 성공적으로 수행되어야 하나의 트랜잭션이 종료되었다고 볼 수 있다.
-commit : 올바르게 실행된 트랜잭션을 영구히 반영
-rollback : 잘못 실행된 트랜잭션을 이전의 상태(백업상태)로 되돌림
-savepoint : 백업지점
#트랜잭션의 특성(중요)
1.원자성(atomicity) : 트랜잭션은 모두 성공적으로 실행되던지, 모두 실행되지 않은 상태이어야 한다.
2.일관성(consistency) : 트랜잭션 실행 이전데이터가 정상이라면 실행 이후 데이터역시 정상이어야한다.
3.고립성(isolation) : 하나의 트랜잭션이 다른 트랜잭션의 영향을 받아 데이터가 변경되지 않아야한다.
4.지속성(durability) : 트랜잭션이 모두 성공적으로 실행되면, 갱신된 데이터는 영원히 저장된다.

2.Commit
1)데이터조작어와 데이터정의어에서 commit
-DML(데이터조작어 : insert, update, selete, select)로 변경된 데이터는 버퍼에만 있다.(commit 안됨)
-DDL(데이터정의어 : create, alter, rename, drop)로 변경된 데이터는 DB에 영구히 존재한다.(commit됨)
#DML수행후 : buffer에 저장, 현재사용자는 조회가능, 다른사용자는 조회+변경 불가능, locking설정됨
#commit수행 후 : DB에 저장, 모든사용자가 조회가능, locking해제됨, 다른사용자가 조회+변경가능
ex) insert into player (player_id,...) values ('1997035',...); // DML수행후 상태
commit; // commit 수행후 상태

2)트랜잭션의 기본적인 수행방식
auto commit : sql server의 수행방식으로 DML, DDL수행할때마다 commit자동수행
암시적 트랜잭션 : oracle의 수행방식으로 트랜잭션의 시작은 dbms가, 끝은 사용자가 명시적으로commit
명시적 트랜잭션 : 트랜잭션의 시작(begin transaction)과 끝(commit transcation)은 모두 사용자가 명시적으로 수행

3.Rollback
-백업명령어
ex)rollback;

4.savepoint
-저장점. 롤백시 transaction 전체작업을 롤백하지 않고, savepoint까지만 롤백하기 위해 저장점을 지정할 수 있음
-savepoint 저장점이름;
ex)savepoint svpt1; //현재를 저장점1로 함
rollback to svpt1; // 저장점1이후의 트랜잭션 수행만 취소함.
rollback; //모든 트랜잭션 수행을 취소함.
예제:
================================================================================
insert into player (player_id, team_id, player_name) values ('1999035','K02','이운재);

savepoint svpt_A; // 저장점A생성 (이운재 선수만 삽입함)

update player set weight =100;

savepoint svpt_B; //저장점 B생성 (이운재 선수 삽입하고 몸무게를 100으로 설정함(다른선수포함))

delete from player;
================================================================================
select해보기:
저장점B로 롤백:
저장점A로 롤백:
저장점B로 다시 롤백하면 어떻게될까?:
-저장점A로 롤백된 상태에선 A이후 트랜잭션이 모두 취소됬으므로 
savepoint to svpt_B;라는 명령(트랜잭션)도 취소됬음
따라서 저장점B을 생성하는 명령(위에명령)은 
rollback to svpt_A;할때 수행되지 않았으므로 저장점B는 없음
svpt_B never extablished in this session or is invalid(저장점B는 존재하지 않거나 수행불가능함)

댓글

이 블로그의 인기 게시물

1장_1절 관계형 데이터베이스 개요

2장_1절. 표준 조인(Standard Join)

BigData 청년인재 프로그램(Java) - 11. 추상 클래스와 인터페이스