oracle-tom-dmllock-tx

oracle_db發表於2012-04-23
ORACLE 的DML鎖作用:確保一次,只有一個人能修改某一行,你在處理這個表時,別人不能刪除這個表

tx鎖--事務鎖,當事務發起第一個修改時會得麼TX鎖,直到事務提交或回滾。
TX鎖原理--是一種排隊機制,使得其它會話可以等待這個事務執行。

如:
會話1:

SQL> select owner,table_name from t where wner='SCOTT';

OWNER                          TABLE_NAME
------------------------------ ------------------------------
SCOTT                          DEPT
SCOTT                          EMP
SCOTT                          BONUS
SCOTT                          SALGRADE
SCOTT                          SCOTTBK
SCOTT                          DEMO

6 rows selected.

SQL> update t set wner='XXX' where table_name='DEMO';

1 row updated.【這裡會話1發起了更新】

會話2去檢視這個時候的鎖情況,前提假設資料庫是單使用者!!
SQL> select username,
  2         v$lock.sid,
  3         trunc(id1/power(2,16)) rbs,
  4         bitand(id1,to_number('ffff','xxxx'))+0 slot,
  5         id2 seq,
  6         lmode,
  7         request
  8  from v$lock, v$session
  9  where v$lock.type = 'TX'--查詢TX型別鎖
 10    and v$lock.sid = v$session.sid
 11    and v$session.username = USER;

USERNAME          SID        RBS       SLOT        SEQ      LMODE    REQUEST
---------- ---------- ---------- ---------- ---------- ---------- ----------
SYS               159          3         12        469          6          0
[LMODE=6]表示是一個排他鎖,REQUEST=0說明表示該會話沒有發出請求,該會話擁有這個鎖

SQL> select XIDUSN, XIDSLOT, XIDSQN
  2    from v$transaction;[對於每個活動的事務都包含一條記錄]

    XIDUSN    XIDSLOT     XIDSQN
---------- ---------- ----------
         3         12        469

SQL> 

如果把會話1的更新事務提交,以上的兩個查詢都沒有記錄。因為提交以後事務結束了,鎖就釋放了。

TX鎖原理---排隊機制

會話1:


SQL> update emp set ename=upper(ename);

14 rows updated.
會話2:

SQL> conn scott/scott
Connected.
SQL> update dept set deptno=deptno-10;

這個時候發現會話2中無法更新,因為會話2已經被阻塞了。

會話3.

SQL> col blocker format a10
SQL> col blockee format a10
SQL> select
  2        (select username from v$session where sid=a.sid) blocker,
  3         a.sid,
  4        ' is blocking ',
  5         (select username from v$session where sid=b.sid) blockee,
  6             b.sid
  7    from v$lock a, v$lock b
  8   where a.block = 1
  9     and b.request > 0
 10     and a.id1 = b.id1
 11     and a.id2 = b.id2;

BLOCKER           SID 'ISBLOCKING'  BLOCKEE           SID
---------- ---------- ------------- ---------- ----------
SCOTT             159  is blocking  SCOTT             145

SQL> 


這個時候一會話1如果提交,那會話2馬上會跟著提交,也就是說會話2在等待會話1釋放掉TX鎖,排隊等候機制。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15720542/viewspace-722027/,如需轉載,請註明出處,否則將追究法律責任。