테이블에 어떤 데이타를 insert, update, delete를 할 때는 한 명의 사용자만이 해당 테이블을 변경할 수 있도록 해준다.
그 런데 만약 A테이블에서 데이타를 읽어와서 이와 관련된 내용을 B테이블에 넣으려는데 B테이블에 FK로 A테이블의 PK가 걸려있다고 가정해보자. 나는 A테이블에서 pk가 1인 데이타를 읽어와서 B테이블에 업데이트를 해줘야하는데 데이타를 읽어와서 업데이트 하기 전에 누군가가 데이타 1을 지워버렸다면?? 내가 B테이블에 업데이트를 시도할 때 fk 오류가 날 것이다. pk가 사라졌으니 말이다.
자 이럴 때 사용할 수 있는 것이 select ... for update 이다.
for
update는 읽어온 모든 rows와 그 rows와 관련된 인덱스 엔트리까지 lock을 한다. 이는 update문을 사용했을
때와 동일한 것이다. for update로 실행된 select문은 다른 모든 업데이트 관련 쿼리를 사용할 수 없다. 따라서 또
다른 select ... for update 문 역시 기존 세션에서 commit이나 rollback이 실행되기 전까지 기다렸다가
최신정보를 select하게 된다.
사용법은 단순하다.
SQL > select * from emp for update;
[Oracle/SQL] 특정 사용자의 권한 조회 (0) | 2015.04.20 |
---|---|
[오라클/oracle] Oracle Database Character set 변경(EUC-KR을 UTF8 변경) (0) | 2015.04.20 |
[오라클/SQL] 컬럼에 외래키 제약 추가하기 ( ALTER TABLE ) (0) | 2015.04.20 |
[오라클/SQL] 테이블에 컬럽 추가/삭제 하기 (0) | 2015.04.20 |
[오라클/oracle] Insert 속도 높이기 (0) | 2015.04.20 |
이 에러가 났을 때 뭐 때문에 busy라고 나오는지 궁금하다면??
sysdba권한으로 아래 쿼리를 날려보자. 무슨쿼리 때문에 어느 테이블이 lock이 걸려있는지 확인할 수 있다.
SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM,S.USERNAME,
S.MACHINE,S.PORT , S.LOGON_TIME,SQ.SQL_FULLTEXT
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S,
V$PROCESS P, V$SQL SQ
WHERE L.OBJECT_ID = O.OBJECT_ID
AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR
AND S.SQL_ADDRESS = SQ.ADDRESS;
위 쿼리를 실행해서 SID와 SERIAL#을 알아내면 아래와 같은 명령으로 해당 세션을 죽일 수 있다.
ALTER SYSTEM KILL SESSION 'SID, SERIAL#';
이상~!!! 당신에게 노력과 행운의 여신이 함께하여 문제가 해결되기를~~
[오라클/oracle] 테이블 스페이스 사용량 확인하기 (0) | 2015.04.20 |
---|---|
[오라클/oracle] ORA-14086: a partitioned index may not be rebuilt as a whole (0) | 2015.04.20 |
[오라클/oracle] ORA-32773: operation not supported for smallfile tablespace (0) | 2015.04.20 |
[오라클/oracle] ORA-00845: MEMORY_TARGET not supported on this system (0) | 2015.04.20 |
[오라클/oracle] ORA-14511: cannot perform operation on a partitioned object (0) | 2015.04.20 |