본문 바로가기

sql

11-1. 데이터 조작 언어(TCL문)

728x90
반응형

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 걸림.

으로 락걸림

 

 

728x90
반응형

'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