[鎖機制] 鎖相關查詢

leon830216發表於2013-09-18
1. 事務鎖查詢
1.1 每個事務只能有一個TX鎖
select
    username,
    v$lock.sid,
    trunc(id1/power(2,16)) rbs,
    bitand(id1,to_number('ffff','xxxx'))+0 slot,
    id2 seq,
    lmode,
    request,
    block,
    v$lock.type
from
    v$lock,
    v$session
where
    v$lock.type = 'TX'
and v$lock.sid = v$session.sid
and v$session.username = USER
/

2. 事務查詢
select XIDUSN, XIDSLOT, XIDSQN from v$transaction;

3. 鎖定會話與被鎖定會話
column blocker format a20
column blockee format a20
column isblocking format a10
select
(
    select
        username
    from
        v$session
    where
        sid=a.sid
) blocker,
a.sid,
' is blocking ',
(
    select
        username
    from
        v$session
    where sid=b.sid
) blockee,
b.sid
from
    v$lock a,
    v$lock b
where
    a.block = 1
and b.request > 0
and a.id1 = b.id1
and a.id2 = b.id2
/

4. 檢視TX與TM鎖資訊
4.1 一個事務只有一個TX鎖,但修改了多少了物件就有多少個TM鎖
4.2 ID1列就是物件的ID
select
(
    select
        username
    from
        v$session
    where
        sid = v$lock.sid
) username,
sid,
id1,
id2,
lmode,
request,
block,
v$lock.type
from
    v$lock
where sid = (
                select
                    sid
                from
                    v$mystat
                where
                    rownum=1
            )
/

5. 查詢DDL鎖資訊
5.1 排他DDL鎖,DDL執行期間,其他會話只能查詢,不能修改物件和資料
5.2 共享DDL鎖,DDL執行期間,其他會話可以查詢和修改資料
5.3 可中斷解析鎖
5.4 建立檢視
@D:\oracle\product\10.2.0\db\RDBMS\ADMIN\catblock.sql

select
    session_id sid,
    owner, -- owner不是鎖的擁有者,而是被鎖定物件的擁有者
    name,
    type,
    mode_held held,
    mode_requested request
from
    dba_ddl_locks
where
    wner = 'GO';
/

6. 關於阻塞
6.1 insert
有一個帶主鍵的表,或者表上有惟一的約束,但有兩個會話試圖用同樣的值插入一行
多個表透過引用完整性約束相互連結,如果父表正在建立或刪除,對子表的插入可能會阻塞
如果應用允許終端使用者生成主鍵/惟一列值,往往就會發生INSERT阻塞
最好使用序列生成主鍵或唯一鍵的值

6.2 merge update delete
如果發生此類阻塞,說明應用中同時存在更新丟失的bug
可以採用select for update nowait來防止更新丟失和阻塞

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