■ TCL 문 3가지
"Transaction Control Language"
1. commit: 데이터베이스에 변경사항을 영구히 저장하겠다.
2. rollback: 최종적으로 commit 이후에 작업했던
DML 작업들을 취소하겠다.
3. savepoint: 롤백 할 지점을 지정하는 sql
■ commit 의 종류 2가지
1. 암시적 commit
-정상종료(exit)
-DDL문 실행(create, alter, truncate, rename)
-DCL문 실행(grant, revoke)
2. 명시적 commit
■ rollback 의 종류 2가지
1. 암시적 rollback
-비정상 종료
2. 명시적 rollback
**즉, exit 쓰고 작업창 끄면 commit 된거고
그냥 x 눌러서 창 끄면, rollback 되고 꺼짐.
문제337.(오늘의 마지막 문제)
사원테이블에는 존재하지않는데
부서테이블에만 존재하는
부서번호에 대한
데이터를
부서테이블에서 지우시오
(즉, 부서번호 40번만 부서테이블에서
지우라는 소리)
DELETE FROM dept
WHERE deptno NOT IN
(SELECT nvl(deptno, -1)
FROM emp);
DELETE FROM DEPT
WHERE deptno = (
SELECT deptno
FROM DEPT
MINUS
SELECT deptno
FROM EMP );
■ commit 의 종류 2가지
1. 암시적 commit
-정상종료(exit)
-DDL문 실행(create, alter, truncate, rename)
-DCL문 실행(grant, revoke)
2. 명시적 commit
■ rollback 의 종류 2가지
1. 암시적 rollback
-비정상 종료
1. 도스창을 꺼버렸을 때
2. 시스템이 다운 되었을 때
2. 명시적 rollback
예를 들면
여러분들이 은행에가서
입출금 통장-------------->적금통장
delete 100만원 이체 insert
적금통장에 insert 되기 직전에
은행 서버가 다운되면
과연 그 돈은??
암시적 rollback 이 발생해서
입출금통장에 100만원이 도로 입금된다.
■ savepoint
(현업에서 별로 많이 안쓴다)
■ savepoint 테스트
1. 사원테이블의 월급을 전부 0으로 변경하시오
update emp
set sal=0;
2. savepoint a ;
3. 사원테이블의 부서번호를 전부 0으로 변경하시오
update emp
set deptno = 0;
4. savepoint b;
5. 사원 테이블의 이름을 전부 null 로 변경하시오
update emp
set ename = null;
6. savepoint c;
7. 사원 테이블을 전부 삭제하시오
delete from emp;
8. rollback to c;
>>>이 뜻은 C 까지 롤백해라
9. rollback;
>>>1번 이전의 origin 테이블로 돌아감
■ lock
"데이터를 수정/삭제/입력하지 못하게끔
행이나 테이블을 잠궈버리는 기능"
왜 잠궈버리는가?
데이터의 일관성을 유지시키기 위해서이다
A 세션 (도스창1) B 세션 (도스창2)
1. update emp
set sal=9000
where ename='SCOTT';
2. update emp
set sal =0
where ename='SCOTT'
3. select ename, sal
from emp
where ename = 'SCOTT';
***이렇게 하면
2번의 set sal= 0 이 안먹고
3번 결과는 set sal=9000 으로 유지된다
만약
다른 도스창에서
set sal=0 을 작업하려면
A도스창에서 작업하는걸 commit 해야 한다
즉, 어떤 하나의 테이블을
내가 변경하고 있다면
알아서 lock 이 걸려서
나만이 변경할 수 있다
다른 사람은 변경할 수 없다.
** sal 외의 다른 컬럼은 변경가능하다.
공통으로 쓰는 테이블이라면
다른 사람의 원활한 작업을 위해
commit 할 것.
1,3번 작업하고 COMMIT 해서
2번 작업이 수행됨
그럼 최종적으로 출력되는 SCOTT의 SAL은?
COMMIT 먹인 9000 이다.
내가 변경한 데이터를 다른 사람(세션)이 볼려면
내가 COMMIT 을 해줘야 다른 사람이
볼 수 있다.
↓
"읽기 일관성"
LOCK?
내가 변경하고 있는 그 데이터를 내가 변경하고 있는
동안에는 그 누구도 변경하지 못하도록
그 데이터의 행(ROW) 에 락을 걸어 잠궈버린다.
그리고 그 LOCK 은 내가 COMMIT(ROLLBACK)을
하면 풀린다.
문제338.
아래의 상황에서는 락이 발생할까, 발생하지 않을까?
A 세션(도스창1) B세션(도스창2)
1. commit; 2. commit;
3. update emp
set sal= 9500
where ename='KING';
4. update emp
set sal =5000
where ename='SMITH';
답: 직접 테스트 해보세요.
A세션 지정값대로 9500 나옴
B세션 지정값대로 5000 나옴
이 경우 LOCK 발생 안함.
king 이 있는 행
smith 있는 행 따로따로 작업하니까.
문제339.
아래의 상황에서는 락이 발생할까, 발생하지 않을까?
A 세션(도스창1) B세션(도스창2)
1. commit; 2. commit;
3. update emp
set sal= 7000
where ename='ALLEN';
4. update emp
set deptno =20
where ename='ALLEN';
답: LOCK 걸림.
행으로 락걸림
'sql' 카테고리의 다른 글
11-3. 데이터 조작 언어(DCL문) (0) | 2019.03.31 |
---|---|
11-2. 데이터 조작 언어(DDL문) (0) | 2019.03.30 |
11. 데이터 조작 언어(DML문) (0) | 2019.03.30 |
10. 집합연산자 (0) | 2019.03.30 |
9. SUBQUERY (0) | 2019.03.30 |