ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DB의 중요한 성질
    Oracle-diary/DB의 중요성질 2020. 1. 29. 18:54
    요약
     
     
    DB 중요성질 2가지 동시성과 무결성
    동시성 다른 계정에서는 COMMIT 되었던 데이터만 읽을 수 있다.
    LOCK 같은 DATA를 고치는데 상대방이 COMMIT하지 않는 경우 대기하게 되는 것.
    DEADLOCK 두 계정 간에 LOCK이 걸린 상태에서 해결하지 못해 ORCL이 해결하는 경우.
    무결성 5가지 제약조건 PK,UK,FK,NOT NULL,CHECK
    제약 생성 방법 2가지 만들고나서 수정하는 경우,만들면서 같이 넣는 경우
    제약의 특징 수정이 없다. 삭제,생성만
     
     
    1)동시성
    READ CONSISTANCY읽기 일관성에 의해서 COMMIT 되었던 데이터만 읽어야 한다 .
     
    *ROLLBACK SEGMENT
    명령어에 의해 수정되고 나서 ROLLBACK하게되면 이전에 존재했던 상태로 돌아가는데
    이전에 존재하는 데이터가 어디에 저장되는곳
     
     
    *LOCK에 걸리다.
     
    다른 접속자가 내가 바꾸고자 하는 내용에 대해서 변경사항이 있지만 COMMIT을 하지 않은 상황일때
    그사람이 COMMIT 혹은 ROLLBACK할때까지 대기하게 되는 상태를 말한다.
     
    부산B>UPDATE EMP
    2 SET SAL =200
    3 WHERE ENAME='SCOTT'; <-서울 A에선 100으로 바꿧으나 아직 COMMIT하지않아 LOCK에 걸림.
     
    LOCK의 정의?
    트랜잭션간 상호 파괴적인 행위를 막기위한 오라클의 보호관리 메카니즘을 일컫는다.
     
     
    LOCK의 성질?
    최소단위 지정 => DML로 지정되는 ROCK은 ROW LEVEL ROCK이다.
    EX)서울A에선 SCOTT이라 바꾸고 부산B에선 SMITH로 바꾸면 서로 다른 ROW라 실행이 된다.
    (ROW간의 관계를 말함.)
     
    -----------------------------------------------------------------------------------------------------------
     
    DEAD LOCK?
     
    둘 사이에는 도저히 해결이 되지 않는 상황으로 교착상태를 말한다 .
     
    EX)
    서울A>UPDATE EMP
    2 SET SAL=100
    3 WHERE ENAME='SCOTT';
     
    1 행이 갱신되었습니다.
     
     
    부산B>UPDATE EMP
    2 SET SAL=200
    3 WHERE ENAME='SMITH';
     
    1 행이 갱신되었습니다.
     
     
    서울A>UPDATE EMP
    2 SET SAL=300
    3 WHERE ENAME='SMITH';
    UPDATE EMP
     
     
     
    부산B>UPDATE EMP
    2 SET SAL=400
    3 WHERE ENAME='SCOTT';
     
     
     
     
     
    서울A>UPDATE EMP <-먼저 기다린 사람의 마지막 명령 하나를 취소시켜줌으로써 교착상태를 없앤다.
    2 SET SAL=300
    3 WHERE ENAME='SMITH';
    UPDATE EMP
    *
    1행에 오류:
    ORA-00060: 자원 대기중 교착 상태가 검출되었습니다.
     
    DEADLOCK을 미연에 방지하기 위한 방법
    프로그래밍적인 방법은 없고 업무 PROCESS에서 임의로 지정해야 한다.
    시간-오전,오후 작업시간을 나누기로 합의해 진행한다.
    업무이관-작업을 분산시키지않고 한곳에 맡긴다.
     
    -----------------------------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------------------------
     
    2)무결성
    제약 조건 5가지를 만족해야만 COMMIT이 되거나 수정이 가능하도록 해놓은 것.
     
    DML의 제약조건 5가지
    1)EMPNO 경우 중복,NULL이 안된다. -PRIMARY KEY(중복된 값이 오면 안된다)
    2)ENAMEDML 경우 중복가능 NULL은 안된다. -NOT NULL
    3)SAL 경우 -값은 안된다.500~5000 -CHECK (미리사전에 범위를 가져야한다는 조건)
    4)DEPTNO 경우 중복X NULL X -FOREIGN KEY (외부에 있는 값을 참조한다)
    5)DNAME 경우 중복X UNIQUE 이 되어야만 무결성이 의미가 있다.-UNIQUE (중복되지 않는 고유한 값)
     
     
     
     
    *무결성이 깨지는 경우
    UPDATE EMP
    SET SAL=50000
    WHERE DEPTNO=10;
    COMMIT;
     
    *무결성을 지키는 방법
    규칙을 정하고 DML작성할때마다 기준에 맞는지 검사를 한후 할지 말지를 결정해야한다.
    DML의 제약 조건에 따라 검사한다. (CONSTRAINT)
     
    만들고 나서 제약조건을 걸어도 되고 제약조건을 걸고 만들어도 된다.
     
    EX)TABLE 만들때 제약조건을 같이 넣음.
    >CREATE TABLE DEPT2
    (DEPTNO NUMBER(2) PRIMARY KEY,
    DNAME VARCHAR2(20) UNIQUE,
    LOC VARCHAR2(20));
     
     
     
     
    >CREATE TABLE EMP2
    (EMPNO NUMBER(4) CONSTRAINT EMP1_EMPNO_PK PRIMARY KEY,
    ENAME VARCHAR2(20) NOT NULL,
    SAL NUMBER(7,2),
    DEPTNO NUMBER(2),
    CONSTRAINT EMP1_SAL_CK CHECK (SAL BETWEEN 500 AND 5000),
    CONSTRAINT EMP1_DEPTNO_FK FOREIGN KEY (DEPTNO)
    REFERENCES DEPT1(DEPTNO)); <- FOREIGN KEY의 참조를 위한 대상
     
    *CONSTRAINT 생성방법
    1. 테이블 정의 시 (2가지 방법 존재)
    1-1 컬럼레벨 정의 방식
    컬럼명 DATATYPE [CONSTRAINT 제약명] 제약 종류 (,없이). <-[]는 생략할수있다는것 EMPNO NUMBER(4) [CONSTRAINT EMP1_EMPNO_PK] PRIMARY KEY
    만약 제약명을 생략했다면 제약의 이름까지 생략한다. <-오라클이 제약명을 임의로 부여 한다. (SYS_C숫자 형식으로 임의로 부여한다.)
    1-2 테이블레벨 정의 방식
    컬럼명 DATATYPE,
    컬럼명 DATATYPE,
    CONSTRAINT 제약명 제약 종류(컬럼명) <-어느 컬럼에 적용되는지 알아야 하기 때문에 컬럼명을 써준다.
    ---------------------------------------------------------------------------------------------------------------------------------------
     
    서울A>INSERT INTO DEPT2
    2 VALUES(1,'A','B');
     
    1 개의 행이 만들어졌습니다.
     
    서울A>INSERT INTO DEPT2
    2 VALUES(1,'B','C');
    INSERT INTO DEPT2
    *
    1행에 오류:
    ORA-00001: 무결성 제약 조건(SCOTT.SYS_C0011263)에 위배됩니다 <-동시에 1을 넣으려고해서 무결성 원칙을 위배한다.
     
     
     
    *내가 생성한 제약조건에 대한 정보를 확인하고 싶을때
    DESC USER_CONSTRAINS
     
     
     
    1 SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,SEARCH_CONDITION
    2 FROM USER_CONSTRAINTS
    3* WHERE TABLE_NAME IN ('EMP2','DEPT2')
    4 /
     
    CONSTRAINT_NAME C TABLE_NAME SEARCH_CONDITION
    --------------- - ------------------------------ --------------------
    SYS_C0011263 P DEPT2
    SYS_C0011264 U DEPT2
    SYS_C0011265 C EMP2 "ENAME" IS NOT NULL <-NOT NULL은 CHECK의 특수한 일종으로
    EMP1_SAL_CK C EMP2 SAL BETWEEN 500 AND <-500~5000사이 제약 CHECK조건
    5000
     
    EMP1_EMPNO_PK P EMP2
    EMP1_DEPTNO_FK R EMP2 <-알파벳 대문자 하나는 제약을 나타낸다.
     
     
     
     
    서울A>INSERT INTO DEPT2 VALUES(3,'A','D');
    INSERT INTO DEPT2 VALUES(3,'A','D')
    *
    1행에 오류:
    ORA-00001: 무결성 제약 조건(SCOTT.SYS_C0011264)에 위배됩니다. <-에러의 이유 조건중 위반한 것은 SYS_C0011264 U DEPT2 부서테이블에 똑같은 부서명을 가진 것이 있기 때문에 안된다.
     
     
     
     
    서울A>INSERT INTO EMP2 VALUES(222,'KILL',3000,10); <-FOREIGN KEY 위반
    INSERT INTO EMP2 VALUES(222,'KILL',3000,10)
    *
    1행에 오류:
    ORA-02291: 무결성 제약조건(SCOTT.EMP1_DEPTNO_FK)이 위배되었습니다- 부모 키가
    없습니다
     
     
    *부모 키가 없다??
    10,20,30,40, PARENT KEY OR MASTER KEY
    50 CHILD KEY OR SLAVE KEY <-부모키들이 있어야 자식키가 있는데 기존에 존재하는 부서에서 수가없는데 없는 것을 찾으려고해서.
    *자식 레코드가 발견 되었다??
    dept(부모)에 deptno=10을 지우려고 했는데 emp에 deptno10에 대한 기록이 있어서 지울수가 없다.그래서 emp(자식)도 같이 지워야한다.
    부모와 자식관계 부모는 자식이 없어도 됨. 자식은 부모가 없으면 존재 X
    ------------------------------------------------------------------------------------------------------------------------------------
     
    2. 테이블 생성 후에 제약 추가하는 방법
    DEPT2 :LOC UNIQUE 제약 추가
    ALTER TABLE 테이블명
    ADD 테이블레벨 정의 방식
     
    ALTER TABLE DEPT2
    ADD CONSTRAINT DEPT2_LOC_UK UNIQUE(LOC) <-제약 추가
     
    EX)
    INSERT INTO DEPT2 VALUES(3,'AAA','BB');
     
     
    INSERT INTO DEPT2 VALUES(3,'AAA','BB');
    1행에 오류:
    ORA-00001: 무결성 제약 조건(SCOTT.DEPT2_LOC_UK)에 위배됩니다.
     
    DEPTNO DNAME LOC
    --------- -------------------- --------------------
    2 AA BB
     
     
    dept2:LOC UNIQUE 제약 삭제
     
    ALTER TABLE DEPT2
    DROP CONSTRAINT DEPT2_LOC_UK; <-제약 삭제
     
    *제약 삭제 하는 2번째 방법
    테이블 삭제하면 제약도 삭제 된다.
    ------------------------------------------------------------------------------------------------------------------------------
    제약의 특징
    *제약은 변경이 없다. 추가 아니면 삭제 뿐.
    *하나의 열에 동시에 여러개의 제약을 걸 수도 있다.\
    EX)
    NOT NULL <-- NULL XXXX
    UNIQUE <--
     
    * NULL 추가 할 수 있을까?
    NULL추가 가능하다.

    'Oracle-diary > DB의 중요성질' 카테고리의 다른 글

    SQL과 ascii코드  (0) 2020.01.29
    SQL과 SQLPLUS 명령어 비교  (0) 2020.01.29
    ROWNUM  (0) 2020.01.29
    NULL특징  (0) 2020.01.29
    LOB  (0) 2020.01.29

    댓글

Designed by Tistory.