oracle-tom-dmllock-tx
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/,如需轉載,請註明出處,否則將追究法律責任。