當前位置:首頁 » 編程語言 » oracle查詢鎖表sql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

oracle查詢鎖表sql

發布時間: 2022-06-11 13:45:55

❶ ORACLE 如何查詢被鎖定表及如何解鎖釋放session

ORACLE
EBS操作某一個FORM界面,或者後台資料庫操作某一個表時發現一直出於"假死"狀態,可能是該表被某一用戶鎖定,導致其他用戶無法繼續操作
復制代碼
代碼如下:--鎖表查詢sqlSELECT
object_name,
machine,
s.sid,
s.serial#
FROM
gv$locked_object
l,
dba_objects
o,
gv$session
s
WHERE
l.object_id
=
o.object_id
AND
l.session_id
=
s.sid;
找到被鎖定的表,解鎖
復制代碼
代碼如下:--釋放SESSION
SQL:
--alter
system
kill
session
'sid,
serial#';
您可能感興趣的文章:mysql
事務處理及表鎖定深入簡析

❷ oracle_capacity鎖怎麼查

1.以下代碼可以查看是否被鎖表:
2selecta.object_name,b.session_id,c.serial#,c.program,c.username,c.command,c.machine,c.lockwait
3fromall_objectsa,v$locked_objectb,v$sessioncwherea.object_id=b.object_idandc.sid=b.session_id;
4
2.查詢鎖表原因:
5selectl.session_idsid,
6s.serial#,
7l.locked_mode,
8l.oracle_username,
9s.user#,
10l.os_user_name,
11s.machine,
12s.terminal,
13a.sql_text,
14a.action
153.接上:
16fromv$sqlareaa,v$sessions,v$locked_objectl
17wherel.session_id=s.sid
18ands.prev_sql_addr=a.address
19orderbysid,s.serial#;
204.解鎖方法:altersystemkillsession』146′;–146為鎖住的進程號,即spid。
215.查看被鎖的表:selectp.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_namefromv$processp,v$sessiona,v$locked_objectb,all_objectscwherep.addr=a.paddranda.process=b.processandc.object_id=b.object_id
226.以上就是oracle查看鎖表的方法,以及一些相關信息,看過之後如果覺得有幫助可以在下面給點個贊~

❸ oracle中如何查詢表被鎖定狀態

SELECTobject_name,machine,s.sid,s.serial#
FROMgv$locked_objectl,dba_objectso,gv$sessions
WHEREl.object_id=o.object_id
ANDl.session_id=s.sid;

如果沒有結果就是沒有被鎖定的,如果查詢有結果,就說明此表被鎖了。如圖:

❹ oracle資料庫鎖表怎麼解決

首先你要知道表鎖住了是不是正常鎖?因為任何DML語句都會對表加鎖。

你要先查一下是那個會話那個sql鎖住了表,有可能這是正常業務需求,不建議隨便KILL session,如果這個鎖表是正常業務你把session kill掉了會影響業務的。
建議先查原因再做決定。

(1)鎖表查詢的代碼有以下的形式:
select count(*) from v$locked_object;
select * from v$locked_object;
(2)查看哪個表被鎖
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
(3)查看是哪個session引起的
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;

(4)查看是哪個sql引起的
select b.username,b.sid,b.serial#,c.* from v$locked_object a,v$session b,v$sql c where a.session_id = b.sid
and b.SQL_ID = c.sql_id and c.sql_id = ''
order by b.logon_time;

(5)殺掉對應進程
執行命令:alter system kill session'1025,41';
其中1025為sid,41為serial#.

❺ 平時使用oracle時,為什麼會鎖表

資料庫事務及隔離級別

隔離級別:臟讀、幻讀、一致讀、不可重復讀、更新丟失

1.臟讀(Dirty Reads):一個事務開始讀取了某行數據但是另外一個事務已經更新了此數據但沒有能夠及時提交。這是相當危險很可能所有操作都被回滾

2.幻讀(Phantom Reads):也稱為幻像(幻影)。事務在操作過程中進行兩次查詢,第二次查詢結果包含了第一次查詢中未出現的數據(這里並不要求兩次查詢SQL語句相同)這是因為在兩次查詢過程中有另外一個事務插入數據造成的

3.不可重復讀(Non-repeatable Reads):一個事務對同一行數據重復讀取兩次但是卻得到了不同結果。例如在兩次讀取中途有另外一個事務對該行數據進行了修改並提交

4.兩次更新問題(Second lost updates problem):無法重復讀取特例,有兩個並發事務同時讀取同一行數據然後其中一個對它進行修改提交而另一個也進行了修改提交這就會造成第一次寫操作失效

5.更新丟失(Lost update):兩個事務都同時更新一行數據但是第二個事務卻中途失敗退出導致對數據兩個修改都失效了這是系統沒有執行任何鎖操作因此並發事務並沒有被隔離開

20、鎖是什麼?

鎖:在所有的DBMS(資料庫管理系統)中,鎖是實現事務的關鍵,鎖可以保證事務的完整性和並發性。與現實生活中鎖一樣,它可以使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構。當然鎖還分級別的。

鎖分為行級鎖和表鎖。

行級鎖:主要是在執行操作過程中,鎖定指定的行。

主要的鎖行語句有:insert ,update,delete ,及select ....for update。

表鎖:指在運行操作指令過程中,由用戶指定鎖定某張表。lock table XXX in mode share;

共享鎖,排他鎖,共享排它,行共享,行排他。

鎖模式包括?

共享鎖:(讀取)操作創建的鎖。其他用戶可以並發讀取數據,但任何事物都不能獲取數據上的排它鎖,直到已釋放所有共享鎖。

排他鎖(X鎖):對數據A加上排他鎖後,則其他事務不能再對A加任任何類型的封鎖。獲准排他鎖的事務既能讀數據,又能修改數據。

更新鎖:更新 (U) 鎖可以防止通常形式的死鎖。如果兩個事務獲得了資源上的共享模式鎖,然後試圖同時更新數據,則兩個事務需都要轉換共享鎖為排它 (X) 鎖,並且每個事務都等待另一個事務釋放共享模式鎖,因此發生死鎖。

若要避免這種潛 在的死鎖問題,請使用更新 (U) 鎖。一次只有一個事務可以獲得資源的更新 (U) 鎖。如果事務修改資源,則更新 (U) 鎖轉換為排它 (X) 鎖。否則,鎖轉換為共享鎖。

鎖的粒度主要有以下幾種類型:

行鎖: 粒度最小,並發性最高

頁鎖:一次鎖定一頁。25個行鎖可升級為一個頁鎖。

表鎖:粒度大,並發性低

資料庫鎖:控制整個資料庫操作

樂觀鎖:樂觀鎖假設認為數據一般情況下不會造成沖突,所以在數據進行提交更新的時候,才會正式對數據的沖突與否進行檢測,如果發現沖突了,則讓返回用戶錯誤的信息,讓用戶決定如何去做。一般的實現樂觀鎖的方式就是記錄數據版本。

悲觀鎖:每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關系型資料庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖,讀鎖,寫鎖等,都是在做操作之前先上鎖。

20、資料庫的樂觀鎖和悲觀鎖是什麼? oracle 是行級鎖

資料庫管理系統(DBMS)中,並發控制的任務是:確保在多個事務同時存取同一數據時,不破壞事務的隔離性和統一性以及資料庫的統一性。

悲觀鎖:假定會發生並發沖突,屏蔽一切可能違反數據完整性的操作

樂觀鎖:假設不會發生並發沖突,只在提交操作時檢查是否違反數據完整性。

21、悲觀鎖和樂觀鎖的區別,怎麼實現

悲觀鎖:一段執行邏輯加上悲觀鎖,不同線程同時執行時,只能有一個線程執行,其他的線程在入口處等待,直到鎖被釋放。

樂觀鎖:一段執行邏輯加上樂觀鎖,不同線程同時執行時,可以同時進入執行,在最後更新數據的時候要檢查這些數據是否被其他線程修改了(版本和執行初是否相同),沒有修改則進行更新,否則放棄本次操作。

❻ oracle 怎麼查看數據被鎖

1.創建測試表,如下圖。

createtabletest_lock(idnumber,valuevarchar2(200));


注意事項:

簡化數據:可以將復雜的查詢創建為其他人可以使用的視圖,而不必了解復雜的業務或邏輯關系。這簡化並掩蓋了視圖用戶數據的復雜性。

表結構設計的補充:在設計的系統才剛剛開始,大部分的程序直接訪問數據表結構,但是隨著業務的變化,系統更新,等等,引起了一些表結構不適用,這次修改系統的表結構太大,開發成本較高的影響。

這個時候可以創建一個視圖來補充表結構設計,降低開發成本。程序可以通過查詢視圖直接獲得它想要的數據。

添加安全性:視圖可以向用戶顯示表中的指定欄位,而不是向用戶顯示表中的所有欄位。在實際開發中,視圖通常作為提供數據的一種方式提供,並將只讀許可權提供給第三方以供查詢使用。

❼ oracle 鎖表如何查看

通過以下語句查詢
SELECT
'alter system kill session '''||c.sid||','|| c.SERIAL#||',@'|| c.inst_id||'''' ,
c.INST_ID,
c.pADDR,
A.OWNER, --OBJECT所屬用戶
A.OBJECT_NAME, --OBJECT名稱
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID, --鎖表用戶的session
B.ORACLE_USERNAME, --鎖表用戶的Oracle用戶名
B.OS_USER_NAME,--鎖表用戶的操作系統登陸用戶名
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE, --鎖表用戶的計算機名稱
C.STATUS, --鎖表狀態
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM --鎖表用戶所用的資料庫管理工具
FROM
ALL_OBJECTS A,
V$LOCKED_OBJECT B,
SYS.V_$SESSION C
WHERE
A.OBJECT_ID = B.OBJECT_ID
AND B.PROCESS = C.PROCESS --AND C.STATUS='ACTIVE'
ORDER BY 1,2

❽ oracle查詢鎖表與解鎖情況提供解決方案

如果發生了鎖等待,我們可能更想知道是誰鎖了表而引起誰的等待
以下的語句可以查詢到誰鎖了表:
復制代碼
代碼如下:
SELECT
/*+
rule
*/
s.username,
decode(l.type,'TM','TABLE
LOCK',
'TX','ROW
LOCK',
NULL)
LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM
v$session
s,v$lock
l,dba_objects
o
WHERE
l.sid
=
s.sid
AND
l.id1
=
o.object_id(+)
AND
s.username
is
NOT
NULL
以下的語句可以查詢到誰在等待:
復制代碼
代碼如下:
SELECT
/*+
rule
*/
lpad('
',decode(l.xisn
,0,3,0))||l.oracle_username
User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM
v$locked_object
l,dba_objects
o,v$session
s
WHERE
l.object_id=o.object_id
AND
l.session_id=s.sid
ORDER
BY
o.object_id,xisn
DESC
解鎖命令:
復制代碼
代碼如下:
alter
system
kill
session
'sid,serial#'
1).
復制代碼
代碼如下:
select
LOCK_INFO.OWNER
||
'.'
||
LOCK_INFO.OBJ_NAME
as
"已鎖物件名稱",
--物件名稱(已經被鎖住)
LOCK_INFO.SUBOBJ_NAME
as
"已鎖子物件名稱",
--
子物件名稱(已經被鎖住)
SESS_INFO.MACHINE
as
"機器名稱",
--
機器名稱
LOCK_INFO.SESSION_ID
as
"會話ID",
--
會話SESSION_ID
SESS_INFO.SERIAL#
as
"會話SERIAL#",
--
會話SERIAL#
SESS_INFO.SPID
as
"OS系統的SPID",
--
OS系統的SPID
(SELECT
INSTANCE_NAME
FROM
V$INSTANCE)
"實例名SID",
--實例名SID
LOCK_INFO.ORA_USERNAME
as
"ORACLE用戶",
--
ORACLE系統用戶名稱
LOCK_INFO.OS_USERNAME
as
"OS用戶",
--
作業系統用戶名稱
LOCK_INFO.PROCESS
as
"進程編號",
--
進程編號
LOCK_INFO.OBJ_ID
as
"對象ID",
--
對象ID
LOCK_INFO.OBJ_TYPE
as
"對象類型",
--
對象類型
SESS_INFO.LOGON_TIME
as
"登錄時間",
--
登錄時間
SESS_INFO.PROGRAM
as
"程式名稱",
--
程式名稱
SESS_INFO.STATUS
as
"會話狀態",
--
會話狀態
SESS_INFO.LOCKWAIT
as
"等待鎖",
--
等待鎖
SESS_INFO.ACTION
as
"動作",
--
動作
SESS_INFO.CLIENT_INFO
as
"客戶資訊"
--
客戶資訊
from
(select
obj.OWNER
as
OWNER,
obj.OBJECT_NAME
as
OBJ_NAME,
obj.SUBOBJECT_NAME
as
SUBOBJ_NAME,
obj.OBJECT_ID
as
OBJ_ID,
obj.OBJECT_TYPE
as
OBJ_TYPE,
lock_obj.SESSION_ID
as
SESSION_ID,
lock_obj.ORACLE_USERNAME
as
ORA_USERNAME,
lock_obj.OS_USER_NAME
as
OS_USERNAME,
lock_obj.PROCESS
as
PROCESS
from
(select
*
from
all_objects
where
object_id
in
(select
object_id
from
v$locked_object))
obj,
v$locked_object
lock_obj
where
obj.object_id
=
lock_obj.object_id)
LOCK_INFO,
(select
SID,
SERIAL#,
LOCKWAIT,
STATUS,
(select
spid
from
v$process
where
addr
=
a.paddr)
spid,
PROGRAM,
ACTION,
CLIENT_INFO,
LOGON_TIME,
MACHINE
from
v$session
a)
SESS_INFO
where
LOCK_INFO.SESSION_ID
=
SESS_INFO.SID
order
by
LOCK_INFO.SESSION_ID;
2).
復制代碼
代碼如下:
select
sql_text
from
v$sqltext
where
address
in
(select
sql_address
from
v$session
where
sid
=
&sid)
order
by
piece;
3).
復制代碼
代碼如下:
ALTER
SYSTEM
KILL
SESSION
'會話ID,會話SERIAL#';
4).
kill
-9
OS系統的SPID

❾ oracle 鎖表時,怎麼查出是哪些SQL語句導致了鎖表

SELECT /*+ rule */ lpad(' ',decode(l.xisn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xisn DESC
執行此SQL即可,結果一看便知,適用於oracle, 其他不解釋~

❿ 查看oracle是否鎖表

Oracle資料庫操作中,我們有時會用到鎖表查詢以及解鎖和kill進程等操作,那麼這些操作是怎麼實現的呢?本文我們主要就介紹一下這部分內容。
(1)鎖表查詢的代碼有以下的形式:
select count(*) from v$locked_object;
select * from v$locked_object;
(2)查看哪個表被鎖
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;
(3)查看是哪個session引起的
select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;
(4)殺掉對應進程
執行命令:alter system kill session'1025,41';
其中1025為sid,41為serial#.