IT/Oracle2011. 4. 21. 18:57


CHAP 8장 데이터 및 동시성 관리
 - SQL사용법을 통해 데이터 관리
 - PL/SQL 객체 식별 및 관리
 - 트리거 및 트리거 이벤트 설명
 - lock 충돌 모니터 및 해결

INSERT명령

 한번에 하나의 행을 생성
 다른 데이블의 여러 행을 삽입한다.


insert into dept_80 (select * from employees where department_id  = 80);

하나 이상의 테이블에서 다른 테이블로 데이터를 대량으로 로드

insert into just_names (first, last)
 (select first_name, last_name from employees);

UPDATE 명령

 테이블의 0개 이상의 행을 변경이 가능하다.

DELETE 명령

 테이블의 0개 이상의 행을 제거한다.

MERGE명령

 단일 명령으로 INSERT및 UPDATE를 수행이 가능하다.

COMMIT및 ROLLBACK명령

다음 명령은 트랜잭션을 완료하는 데 사용됩니다.
  COMMIT : 변경 사항을 영구적으로 적용
  ROLLBACK : 변경 사항을 되돌린다.

PL/SQL

  Oracle의 PL/SQL은 4세대 프로그래밍 언어로 다음과 같은 기능 제공
  - SQL의 절차적 확장
  - 플랫폼과 제품 간의 이식성
  - 높은 수준의 보안 및 데이터 무결성 보호
  - 객체 지향 프로그래밍 지원

PL/SQL 객체 관리

  DBA는 다음을 수행이 가능함.
  - 문제가 되는 PL/SQL 객체 식별
  - 적절한 PL/SQL 사용법 제안
  - DB로 PL/SQL 객체 로드
  - PL/SQL 개발자의 문제 해결 지원

PL/SQL객체

다양한 유형의 PL/SQL 데이터 베이스 객체가 있습니다.
  - 패키지
  - Package Body
  - Type Body
  - 프로시저
  - 함수
  - 트리거

Lock

 - 다중 세션에서 동일한 데이터를 동시에 변경하는 것을 방지합니다.
 - 주어진 명령문에 대해 가능한 가장 낮은 레벨에서 자동으로 획득됩니다.
 - escalate하지 않습니다.

SQL> LOCK TABLE employees IN EXCLUSIVE MODE;

이 명령을 통해 lock된 테이블에서 행을 갱신하려는 다른 트랜잭션은 lock요청을 실행한 트랜잭션이 완료될 때가지 대기해야 합니다.

 몇가지 Lock모드

  - ROW SHARE : lock된 테이블에 대한 동시 엑세스를 허용하지만 세션이 배타적 엑세스를 위해 전체 테이블을 lock하는 것은 금지합니다.
  - ROW EXCLUSIVE : ROW SHARE와 동일하지만 SHARD모드에서 lock를 금지합니다.
  - SHARE : 동시 query는 허용하지만 lock된 테이블에 대한 갱신은 금지합니다.

Enqueue 메커니즘
 - lock을 대기하는 세션
 - 요청된 lock모드
 - 세션에서 lock을 요청하는 순서
- lock요청은 자동으로 큐에 저장됩니다. lock을 보유하는 트랜잭션이 완료되면 대기 중인 다음 세션이 lock을 보유하게 됩니다.
- Enqueue 메커니즘은 lock이 요청된 순서와 요청된 lock모드를 추적합니다.
- lock을 이미 보유한 세션은 큐의 끝으로 이동하지 않고 해당 lock의 변환을 요청할 수 있습니다.

Lock 충돌 유발 원인

- 커밋되지 않은 변경 사항
- 장기 실행 트랜잭션
- 필요 이상으로 높은 lock레벨

Lock충돌 감지

Enterprise Manager의 Blocking Sessions페이지를 사용하여 lock충돌을 찾습니다.
Session ID링크를 눌러 실제 SQL문을 포함하여 lock세션에 대한 정보를 확인합니다.

Lock충돌 해결

  - lock을 보유하는 세션을 커밋 또는 롤백합니다.
  - 최후의 수단으로 lock을 보유하는 세션을 종료합니다.

세션이 종료된 유저를 다시 실행하려고 할때 다음과 같은 오류 발생

ORA-03135 : connection lost contact

SQL을 사용하여 Lock충돌 해결

STEP1
SQL> select sid, serial#, username
from v$session where sid in
(select blocking_session from v$session)

STEP2

SQL> alter system kill session '144,8982' immediate;

 

 

Posted by 예영교육 연구소