(1)

💻 Programming/Oracle 11g

[오라클/oracle] select ... for update

테이블에 어떤 데이타를 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;