다시한번말하지만~~~ 글재주제로입니다.
이세상에 존재하는 모든 데이터베이스는
무결성을 베이스로 해서 데이터베이스가 만들어진다.( 아니면 말고;;; )
데이터는 한곳에 있는데 그 데이터를 여러사람들이 접근을 해야하고
그로인해서 발생할수있는 문제들로 인해서 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
145SQL>
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 |