본문 바로가기

Oracle/오라클 양성반 15기

for update


다시한번말하지만~~~ 글재주제로입니다.

 

이세상에 존재하는 모든 데이터베이스는

무결성을 베이스로 해서 데이터베이스가 만들어진다.( 아니면 말고;;; )

 

데이터는 한곳에 있는데 그 데이터를 여러사람들이 접근을 해야하고

그로인해서 발생할수있는 문제들로 인해서 LOCK이라는것이 생겼다.

 

뭐 각설하고

보통 TX,TM 여러가지 락들이 있는데

그중에서 사용자가 원하는 데이터를 락을 걸수는 없을라나?

구조를 보면 누군가 update를 하거나 delete를 하면 lock을 획득하고

다른사람이 그 데이터를 볼때 오라클이면 오라클만의 구조로 무결성을 유지하고, MSSQL이면 mssql에 맞는 구조로 무결성을 유지한다.

 

헌데 select 한 데이터를 락을 걸어야 할경우도 분명있다.

 

9i부터 새로 생긴기능인 for update는 select를 해서 lock 걸어주는 기능이다.

 

옵션.

 

1. FOR UPDATE with no option
2. FOR UPDATE NOWAIT(= WAIT 0)
3. FOR UPDATE WAIT integer (0 ~ 4294967295, second)
4. FOR UPDATE OF

테스트)

총 3개의 세션 필요.

 

A세션 - sid = 145

B세션 - sid = 141

C세션 - sys계정으로 모니터링

 

1. sys계정으로 현재 상황을 먼저 보자.

C세션 -

 

현재는 아무 뻘짓도 안하니 아무 일도 없다.

 

SQL> select sid, lockwait From v$session where username = 'HR';

       SID LOCKWAIT
---------- --------
       141
       145

SQL>

 

SQL> select sid, type, lmode, request From v$lock where sid in (141,145);

no rows selected

SQL>

 

2. A세션에서 for update 발생시키자.

 

SQL> select employee_id,last_name from employees where department_id = 20 for update;

EMPLOYEE_ID LAST_NAME
----------- -------------------------
        201 Hartstein
        202 Fay

SQL>

 

3. C세션에서 다시 현재 상황을 보자.

TM락과 , TX락이 발생했다.

 

SQL> select sid, lockwait From v$session where username = 'HR';

       SID LOCKWAIT
---------- --------
       141
       145

SQL> select sid, type, lmode, request From v$lock where sid in (141,145);

       SID TY      LMODE    REQUEST
---------- -- ---------- ----------
       145 TM          3          0  <---- 3 - RX
       145 TX           6          0  <---- 6 - X

SQL>

 

4. B세션에서 A에서 SELECT한 데이터를 업데이트 해보자.

SQL> update employees set last_name = 'babo' where department_id = 20;

거서 깜빡깜빡~~~~ 대기중~~~

 

5. C세션에서 다시 현재 상황을 보자.

SQL> select sid, lockwait From v$session where username = 'HR';

       SID LOCKWAIT
---------- --------
       141 29FBA14C
       145

SQL> select sid, type, lmode, request From v$lock where sid in (141,145);

       SID TY      LMODE    REQUEST
---------- -- ---------- ----------
       141 TX          0          6 <---- 141번 세션이 X모드로 요청을 기다리고 있다.
       145 TM          3          0
       141 TM          3          0
       145 TX          6          0

SQL>

 

6. A세션에서 commit 을 해보자.

SQL> commit;

Commit complete.

SQL>

 

7. C세션에서 다시 현재 상황을 보고 B세션의 모습을 보자.

C세션

SQL> select sid, lockwait From v$session where username = 'HR';

LOCK대기상태가 사라졌다.

       SID LOCKWAIT
---------- --------
       141
       145

SQL>  select sid, type, lmode, request From v$lock where sid in (141,145);

       SID TY      LMODE    REQUEST
---------- -- ---------- ----------
       141 TM          3          0
       141 TX          6          0

SQL>

B세션

2 rows updated.

SQL>

'Oracle > 오라클 양성반 15기' 카테고리의 다른 글

SYSOPER  (0) 2010.09.28
dbca. script, template 이것저것  (0) 2010.09.12
pl/sql exception  (0) 2010.09.12
merge into  (0) 2010.09.12
composite data type , cursor  (0) 2010.09.12