oracle當前執行事務鎖
select a1.sid as "被堵塞使用者SID",a1.blocking_session as "堵塞使用者SID",a1.SERIAL#, a1.username, a1.logon_time, a2.type
from v$session a1, v$lock a2
where a1.sid = a2.sid
and a2.type in ('ST', 'UL', 'TX', 'TM')
and a1.blocking_session in
(select c.blocking_session
from v$session c
where c.blocking_session > 0)
order by a1.logon_time;
select a1.sid as "被堵塞使用者SID",a1.blocking_session as "堵塞使用者SID",a1.SERIAL#, a1.username, a1.logon_time, a1.event
from v$session a1 where a1.sid in (select a2.sid from v$lock a2 where a2.type in ('ST', 'UL', 'TX', 'TM')) and a1.blocking_session in
(select c.blocking_session
from v$session c
where c.blocking_session > 0)
order by a1.logon_time;
select a.SID,
a.SERIAL#,
a.USERNAME,
a.status,
a.STATE,
e.SPID,
e.PNAME,
a.MACHINE,
b.OS_USER_NAME,
c.OBJECT_NAME,
c.OBJECT_TYPE,
decode(B.LOCKED_MODE,1,'none',2,'行共享(RS)',3,'行獨佔(RX)',4,'共享鎖(S)',5,'共享行獨佔(SRX)',6,'獨佔(X)') AS LOCKED_MODE,
d.SQL_TEXT
from v$session a inner join
V$LOCKED_OBJECT b on a.PROCESS = b.PROCESS inner join
DBA_OBJECTS c on b.OBJECT_ID = c.OBJECT_ID left join
v$sql d on a.SQL_ID=d.SQL_ID left join
v$process e on a.PADDR=e.ADDR
-- Script. Function: Query the lock info --
-- Script. Name: lock.sql --
-- Author: secooler --
-- Date: 2008.3.6 --
---------------------------------------------------
set pages 1000 lin 126
col kaddr heading 'lock|address'
col username heading 'lock|holder|username' for a18
col sid heading 'lock|holder|session id' format 9999999999
col type heading 'lock|type' format a6
col id1 heading 'id1' format 9999999999
col id2 heading 'id2' format 9999999999
col lmode heading 'lock|mode' format 99999999
col request heading 'request|mode' format 99999999
col blocking_sid format 999999 heading 'blocked|session id'
select /*+rule*/
-- a.kaddr, --
(select username from v$session where sid = a.sid) username,
a.sid,
(select serial# from v$session where sid = a.sid) serial#,
-- (select ctime from v$lock where KADDR = a.kaddr) ctime, --
a.type,
a.id1,
a.id2,
a.lmode,
a.request,
a.block,
b.sid blocking_sid
from v$lock a,
( select * from v$lock
where request > 0
and type <> 'MR'
) b
where a.id1 = b.id1(+)
and a.id2 = b.id2(+)
and a.lmode > 0
and a.type <> 'MR'
order by username,a.sid,serial#,a.type
/
column sid clear
column type clear
column request clear
column username clear
鎖大致分為:
DML鎖 資料鎖
DDL鎖 資料字典鎖
內部鎖 或 LATCH鎖
其中DML鎖分為:
表級別鎖 TM Table dMl
行級別鎖 TX Transaction eXclusive
行級別鎖:
exclusive
表級別鎖:
rs rx s srx x
rs: 同時會持有 tx 的 x 鎖 select ... for update(9i)
lock table table_name in row share mode( 只有表級別鎖不產生行級別 x 鎖 )
與 x 級鎖 衝突
rx: 同時會持有 tx 的 x 鎖 insert update delete select ... for update(10g)
lock table table_name in row exclusive mode( 只有表級別鎖 不產生行級別 x 鎖 )
與 s srx x rx(行級x鎖) 級鎖 衝突
s: 顯示設定的共享鎖
lock table table_name in share mode
與 rx srx x 鎖 衝突
srx: 顯示設定的序列鎖
lock table table_name in share row exclusive mode
與 rx s srx x 鎖 衝突
x: 顯示設定的排他鎖 和 行級別的排他鎖
行級別由 DML 生成
表級別: lock table table_name in exclusive mode ( 不產生行級別 x 鎖 )
與 rs rx s srx x 鎖 衝突
DDL 鎖又分:
DDL 專有鎖:
DDL 操作產生的 DDL 排他鎖 防止 DDL 操作時 其他事物對其進行操作
DDL 鎖 在 DDL 操作內持有 操作結束 DDL 鎖釋放
DDL 操作結束後 會自動 COMMIT
DDL 轉有鎖與另一個 DDL 專有鎖 DDL共享鎖 和 DML 鎖 均衝突
DDL 共享鎖:
同一張表上 同時建立儲存過程 檢視 等操作 會產生 DDL 共享鎖
DDL 共享鎖 與 DDL 排他鎖 衝突
DDL 可中斷解析鎖:
null: 基於會話 解析鎖 cursor 執行時(儲存過程) 其依賴的表上產生了DDL
那麼 cursor 和與之相關的會話和儲存過程 都會被級聯通知
它本身不會阻止 DDL 操作
只要儲存過程一直在記憶體 不被重新編譯 DDL null鎖將一直持有
例:
create or replace procedure p as begin null; end;
/
exec p;
建立 執行儲存過程
select session_id sid, owner, name, type,
mode_held held, mode_requested request
from dba_ddl_locks
where name = 'P';
查詢 DDL 鎖
alter procedure p compile;
重新編譯儲存過程後 DDL 解析鎖消失
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29065182/viewspace-1146790/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring @Transaction 註解是如何執行事務的?Spring
- 檢視當前oracle中正在執行的sql語句OracleSQL
- 檢視oracle當前sessionOracleSession
- Oracle如何查詢當前LockOracle
- Java如何獲取當前執行緒Java執行緒
- Oracle的TX鎖(行級鎖、事務鎖)Oracle
- oracle 10046當前會話Oracle會話
- 【MySQL】鎖——檢視當前資料庫鎖請求的三種方法MySql資料庫
- Oracle查詢當前使用者和當前使用者下的所有表Oracle
- Oracle 查詢當前會話標識Oracle會話
- Oracle的事務和鎖Oracle
- 在繁忙 SQL Server 上執行事件探查器SQLServer事件
- JavaBean中使用JDBC方式進行事務處理JavaBeanJDBC
- SMON: recover undo segment與並行事務恢復並行
- oracle的一致讀和當前讀Oracle
- Oracle查詢當前會話的sidOracle會話
- oracle 跟蹤當前使用者會話Oracle會話
- php 獲取當前域名和當前協議PHP協議
- 當前Activity的onPause執行完後,呼叫Paused介面
- 查詢當前正在執行的job的情況
- 看看當前某個使用者執行什麼
- 檢視當前最消耗CPU/Memory的oracle程式Oracle
- 修改oracle當前會話的語言環境Oracle會話
- Oracle 針對當前等待事件的trace步驟Oracle事件
- Linux當前當前程式Linux
- vue重新整理當前頁面或者當前元件Vue元件
- oracle自治事務引起的死鎖Oracle
- Java 例項 - 如何檢視當前 Java 執行的版本?Java
- 簡單實現Laravel獲取當前執行的SQLLaravelSQL
- Python如何獲取當前執行檔案路徑?Python
- 查詢當前執行的sql及相關內容SQL
- Java通過join方法來暫停當前執行緒Java執行緒
- 查詢當前正在執行的SQL語句並KILLSQL
- 檢視當前使用者執行語句等資訊
- Java:如何輕鬆獲取當前執行的方法名Java
- Oracle前財務經理起訴Oracle為哪般?Oracle
- SAP RETAIL 執行事務程式碼WRP1,報錯-Transaction WRP1 cannot be executed-AI
- Oracle 檢視當前會話 SESSION ID 方法 說明Oracle會話Session