요약 |
|
|
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추가 가능하다. |