ORACLE锁学习总结
生活随笔
收集整理的這篇文章主要介紹了
ORACLE锁学习总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ORACLE鎖機制
http://www.cnblogs.com/gengyulong/archive/2011/04/07/2007586.html專業名詞:
數據庫
事務
并發
鎖
并發控制
排它鎖
共享鎖
X鎖
S鎖
DML鎖
DDL鎖
內部鎖
閂
悲觀封鎖
樂觀封鎖?
阻塞
數據庫是一個多用戶使用的共享資源。當多個用戶并發地存取數據時,在數據庫中就會產生多個事務同
時存取同一數據的情況。若對并發操作不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。
加鎖是實現數據庫并發控制的一個非常重要的技術。當事務在對某個數據對象進行操作前,先向系統發
出請求,對其加鎖。加鎖后事務就對該數據對象有了一定的控制,在該事務釋放鎖之前,其他的事務不
能對此數據對象進行更新操作。
在數據庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖
)。當數據對象被加上排它鎖時,其他的事務不能對它讀取和修改。加了共享鎖的數據對象可以被其他
事務讀取,但不能修改。數據庫利用這兩種基本的鎖類型來對數據庫的事務進行并發控制。
Oracle數據庫的鎖類型
根據保護的對象不同,Oracle數據庫鎖可以分為以下幾大類:DML鎖(data locks,數據鎖),用于保護
數據的完整性;DDL鎖(dictionary locks,字典鎖),用于保護數據庫對象的結構,如表、索引等的結
構定義;內部鎖和閂(internal locks and latches),保護 數據庫的內部結構。
DML鎖的目的在于保證并發情況下的數據完整性,。在Oracle數據庫中,DML鎖主要包括TM鎖和TX鎖,其
中TM鎖稱為表級鎖,TX鎖稱為事務鎖或行級鎖。
當Oracle執行DML語句時,系統自動在所要操作的表上申請TM類型的鎖。當TM鎖獲得后,系統再自動申請
TX類型的鎖,并將實際鎖定的數據行的鎖標志位進行置位。這樣在事務加鎖前檢查TX鎖相容性時就不用
再逐行檢查鎖標志,而只需檢查TM鎖模式的相容性即可,大大提高了系統的效率。TM鎖包括了SS、SX、S
、X 等多種模式,在數據庫中用0-6來表示。不同的SQL操作產生不同類型的TM鎖。
在數據行上只有X鎖(排他鎖)。在Oracle數據庫中,當一個事務首次發起一個DML語句時就獲得一個TX
鎖,該鎖保持到事務被提交或回滾。當兩個或多個會話在表的同一條記錄上執行 DML語句時,第一個會
話在該條記錄上加鎖,其他的會話處于等待狀態。當第一個會話提交后,TX鎖被釋放,其他會話才可以
加鎖。
當Oracle數據庫發生TX鎖等待時,如果不及時處理常常會引起Oracle數據庫掛起,或導致死鎖的發生,
產生ORA-60的錯誤。這些現象都會對實際應用產生極大的危害,如長時間未響應,大量事務失敗等。
悲觀封鎖和樂觀封鎖?
一、悲觀封鎖?
鎖在用戶修改之前就發揮作用:?
Select ..for update(nowait)?
Select * from tab1 for update?
用戶發出這條命令之后,oracle將會對返回集中的數據建立行級封鎖,以防止其他用戶的修改。?
如果此時其他用戶對上面返回結果集的數據進行dml或ddl操作都會返回一個錯誤信息或發生阻塞。?
1:對返回結果集進行update或delete操作會發生阻塞。?
2:對該表進行ddl操作將會報:Ora-00054:resource busy and acquire with nowait specified.
原因分析?
此時Oracle已經對返回的結果集上加了排它的行級鎖,所有其他對這些數據進行的修改或刪除操作都必
須等待這個鎖的釋放,產生的外在現象就是其他的操作將發生阻塞,這個這個操作commit或rollback.?
同樣這個查詢的事務將會對該表加表級鎖,不允許對該表的任何ddl操作,否則將會報出ora-00054錯誤
::resource busy and acquire with nowait specified.
二、樂觀封鎖?
樂觀的認為數據在select出來到update進取并提交的這段時間數據不會被更改。這里面有一種潛在的危
險就是由于被選出的結果集并沒有被鎖定,是存在一種可能被其他用戶更改的可能。因此Oracle仍然建
議是用悲觀封鎖,因為這樣會更安全。
阻塞
定義:?
當一個會話保持另一個會話正在請求的資源上的鎖定時,就會發生阻塞。被阻塞的會話將一直掛起,直
到持有鎖的會話放棄鎖定的資源為止。4個常見的dml語句會產生阻塞?
INSERT?
UPDATE?
DELETE?
SELECT…FOR UPDATE
INSERT
Insert發生阻塞的唯一情況就是用戶擁有一個建有主鍵約束的表。當2個的會話同時試圖向表中插入相同
的數據時,其中的一個會話將被阻塞,直到另外一個會話提交或會滾。一個會話提交時,另一個會話將
收到主鍵重復的錯誤。回滾時,被阻塞的會話將繼續執行。
UPDATE 和DELETE當執行Update和delete操作的數據行已經被另外的會話鎖定時,將會發生阻塞,直到另
一個會話提交或會滾。
Select …for update
當一個用戶發出select..for update的錯作準備對返回的結果集進行修改時,如果結果集已經被另一個
會話鎖定,就是發生阻塞。需要等另一個會話結束之后才可繼續執行。可以通過發出 select… for?
update nowait的語句來避免發生阻塞,如果資源已經被另一個會話鎖定,則會返回以下錯誤:Ora-
00054:resource busy and acquire with nowait specified.
死鎖-deadlock
定義:當兩個用戶希望持有對方的資源時就會發生死鎖.?
即兩個用戶互相等待對方釋放資源時,oracle認定為產生了死鎖,在這種情況下,將以犧牲一個用戶作為代
價,另一個用戶繼續執行,犧牲的用戶的事務將回滾.?
例子:?
1:用戶1對A表進行Update,沒有提交。?
2:用戶2對B表進行Update,沒有提交。?
此時雙反不存在資源共享的問題。?
3:如果用戶2此時對A表作update,則會發生阻塞,需要等到用戶一的事物結束。?
4:如果此時用戶1又對B表作update,則產生死鎖。此時Oracle會選擇其中一個用戶進行會滾,使另一個
用戶繼續執行操作。?
起因:?
Oracle的死鎖問題實際上很少見,如果發生,基本上都是不正確的程序設計造成的,經過調整后,基本
上都會避免死鎖的發生。
DML鎖分類表
表1Oracle的TM鎖類型?
鎖模式 鎖描述 解釋 SQL操作?
0 none?
1 NULL 空 Select?
2 SS(Row-S) 行級共享鎖,其他對象?
只能查詢這些數據行 Select for update、Lock for
update、Lock row share
3 SX(Row-X) 行級排它鎖,?
在提交前不允許做DML操作 Insert、Update、?
Delete、Lock row share
4 S(Share) 共享鎖 Create index、Lock share?
5 SSX(S/Row-X) 共享行級排它鎖 Lock share row exclusive?
6 X(Exclusive) 排它鎖 Alter table、Drop able、Drop index、Truncate table 、Lock exclusive
oracle 鎖問題的解決
可以用Spotlight軟件對數據庫的運行狀態進行監控。
當出現session鎖時,我們要及時進行處理.
1. 查看哪些session鎖:?
SQL語句:select 'alter system kill session '''||sid||','||serial#||''';' from v$session?
where sid in (select sid from v$lock where block = 1);
SQL> select 'alter system kill session '''||sid||','||serial#||''';' from v$session where?
sid in (select sid from v$lock where block = 1);?
'ALTERSYSTEMKILLSESSION'''||SID||','||SERIAL#||''';'?
--------------------------------------------------------------------------------?
alter system kill session '132,731';?
alter system kill session '275,15205';?
alter system kill session '308,206';?
alter system kill session '407,3510';
2. 查看session鎖.?
sql語句:select s.sid, q.sql_text from v$sqltext q, v$session s?
where q.address = s.sql_address?
and s.sid = &sid?
order by piece;
SQL> select s.sid,q.sql_text from v$sqltext q, v$session s where q.address = s.sql_address?
and s.sid in (select sid from v$lock where block = 1) order by piece;?
? ? ? ? SID SQL_TEXT?
---------- ----------------------------------------------------------------?
? ? ? ?77 UPDATE PROFILE_USER SET ID=1,COMPANY_ID=2,CUSTOMER_ID=3,NAMED ??
? ? ? ?77 _INSURED_ID=4,LOGIN=5,ROLE_ID=6,PASSWORD=7,EMAIL=8,TIME_ZON?
? ? ? ?77 E=9 WHERE PROFILE_USER.ID=:34?
3 rows selected.
3. kill鎖的進程.?
SQL語句:alter system kill session '77,22198';
SQL> alter system kill session '391,48398';?
System altered.
4. 查看誰鎖了誰。
select s1.username || [email='@']'@'[/email] || s1.machine
? || ' ( SID=' || s1.sid || ' ) ?is blocking '
? || s2.username || [email='@']'@'[/email] || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS?
blocking_status
? from v$lock l1, v$session s1, v$lock l2, v$session s2
? where s1.sid=l1.sid and s2.sid=l2.sid
? and l1.BLOCK=1 and l2.request > 0
? and l1.id1 = l2.id1
? and l2.id2 = l2.id2 ;
注:?
> : 重定向輸出,將文件的標準輸出重新定向輸出到文件,或將數據文件作為另一程序的標準輸入內容
。?
| :UNIX管道:將一文件的輸出作為另一文件的輸入.
在執行SQL語句試:alter system kill session '391,48398'(sid為391); 應當注意對于sid在100以下
的應當謹慎,可能該進程對應某個application,如對應某個事務,可以kill.
本文來自CSDN博客,轉載請標明出處:
http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4696896.aspx
========
ORACLE里幾種鎖模式
http://blog.csdn.net/lxlj2006/article/details/5999458?
Oracle里鎖有以下幾種模式:?
?
0:none?
1:null 空?
2:Row-S 行共享(RS):共享表鎖?
3:Row-X 行專用(RX):用于行的修改?
4:Share 共享鎖(S):阻止其他DML操作?
5:S/Row-X 共享行專用(SRX):阻止其他事務操作?
6:exclusive 專用(X):獨立訪問使用?
?
? ?數字越大鎖級別越高, 影響的操作越多。?
? 一般的查詢語句如select ... from ... ;是小于2的鎖, 有時會在v$locked_object出現。?
?
select ... from ... for update; 是2的鎖。?
?
? ? 當對話使用for update子串打開一個游標時,?
? ? 所有返回集中的數據行都將處于行級(Row-X)獨占式鎖定,?
? ? 其他對象只能查詢這些數據行,不能進行update、delete或select...for update操作。?
?
insert / update / delete ... ; 是3的鎖。?
?
沒有commit之前插入同樣的一條記錄會沒有反應,?
因為后一個3的鎖會一直等待上一個3的鎖, 我們必須釋放掉上一個才能繼續工作。?
?
創建索引的時候也會產生3,4級別的鎖。?
?
locked_mode為2,3,4不影響DML(insert,delete,update,select)操作,?
但DDL(alter,drop等)操作會提示ora-00054錯誤。?
?
有主外鍵約束時 update / delete ... ; 可能會產生4,5的鎖。?
?
DDL語句時是6的鎖。?
?
以DBA角色, 查看當前數據庫里鎖的情況可以用如下SQL語句:?
select object_id,session_id,locked_mode from v$locked_object;?
select t2.username,t2.sid,t2.serial#,t2.logon_time?
from v$locked_object t1,v$session t2?
where t1.session_id=t2.sid order by t2.logon_time;?
如果有長期出現的一列,可能是沒有釋放的鎖。?
?
我們可以用下面SQL語句殺掉長期沒有釋放非正常的鎖:?
alter system kill session 'sid,serial#';?
如果出現了鎖的問題, 某個DML操作可能等待很久沒有反應。?
?
當你采用的是直接連接數據庫的方式,?
也不要用OS系統命令 $kill process_num 或者 $kill -9 process_num來終止用戶連接,?
因為一個用戶進程可能產生一個以上的鎖, 殺OS進程并不能徹底清除鎖的問題。?
?
記得在數據庫級別用alter system kill session 'sid,serial#';殺掉不正常的鎖。
? ? ? 當事務獲得行鎖后,此事務也將自動獲得該行的表鎖(共享鎖),以防止其它事務進行DDL語句影響
記錄行的更新。事務也可以在進行過程中獲得共享鎖或排它鎖,只有當事務顯示使用LOCK TABLE語句顯
示的定義一個排它鎖時,事務才會獲得表上的排它鎖,也可使用LOCK TABLE顯示的定義一個表級的共享鎖?
,所以行鎖的時候我還的拿個表鎖,免得其他人該了我的表結構或者刪除了我的表。
?
? ? ? 表級鎖兼容性:
?
========
oracle查看鎖表進程,殺掉鎖表進程
http://www.iteye.com/topic/571315查看鎖表進程SQL語句1:?
select sess.sid,?
? ? sess.serial#,?
? ? lo.oracle_username,?
? ? lo.os_user_name,?
? ? ao.object_name,?
? ? lo.locked_mode?
? ? from v$locked_object lo,?
? ? dba_objects ao,?
? ? v$session sess?
where ao.object_id = lo.object_id and lo.session_id = sess.sid;?
查看鎖表進程SQL語句2:?
select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID;?
殺掉鎖表進程:?
如有記錄則表示有lock,記錄下SID和serial# ,將記錄的ID替換下面的738,1429,即可解除LOCK?
alter system kill session '738,1429';?
Oracle有自己的進程管理策略,很多情況下殺進程往往不能即使生效,可以加alter system kill ...?
immediately 試試
還是應該找到鎖表的原因,從根源上解決避免這個問題產生。
========
ORACLE六大鎖模式級別越高影響越多
http://www.2cto.com/database/201307/227562.html
ORACLE里鎖有以下幾種模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表鎖,sub share
3:Row-X 行獨占(RX):用于行的修改,sub exclusive
4:Share 共享鎖(S):阻止其他DML操作,share
5:S/Row-X 共享行獨占(SRX):阻止其他事務操作,share/sub exclusive
6:exclusive 獨占(X):獨立訪問使用,exclusive
?
數字越大鎖級別越高, 影響的操作越多。
?
1級鎖有:Select,有時會在v$locked_object出現。
2級鎖有:Select for update,Lock For Update,Lock Row Share
select for update當對話使用for update子串打開一個游標時,所有返回集中的數據行都將處于行級
(Row-X)獨占式鎖定,其他對象只能查詢這些數據行,不能進行update、delete或select for update操
作。
3級鎖有:Insert, Update, Delete, Lock Row Exclusive
沒有commit之前插入同樣的一條記錄會沒有反應, 因為后一個3的鎖會一直等待上一個3的鎖, 我們必須
釋放掉上一個才能繼續工作。
4級鎖有:Create Index, Lock Share
locked_mode為2,3,4不影響DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作會提示
ora-00054錯誤。
00054, 00000, "resource busy and acquire with NOWAIT specified"
// *Cause: Resource interested is busy.
// *Action: Retry if necessary.
5級鎖有:Lock Share Row Exclusive
具體來講有主外鍵約束時update / delete ... ; 可能會產生4,5的鎖。
6級鎖有:
?
Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive
??
以DBA角色, 查看當前數據庫里鎖的情況可以用如下SQL語句:
<CCID_NOBR>
<CCID_CODE>col owner for a12
col object_name for a16
select b.owner,b.object_name,l.session_id,l.locked_mode
from v$locked_object l, dba_objects b
where b.object_id=l.object_id
/
?
select t2.username,t2.sid,t2.serial#,t2.logon_time?
from v$locked_object t1,v$session t2?
where t1.session_id=t2.sid order by t2.logon_time
/
?
如果有長期出現的一列,可能是沒有釋放的鎖。我們可以用下面SQL語句殺掉長期沒有釋放非正常的鎖:
?
?
1
2
<CCID_NOBR>
<CCID_CODE>alter system kill session 'sid,serial#';
?
如果出現了鎖的問題, 某個DML操作可能等待很久沒有反應。
?
當你采用的是直接連接數據庫的方式,也不要用OS系統命令 $kill process_num 或者 $kill -9?
process_num來終止用戶連接,因為一個用戶進程可能產生一個以上的鎖, 殺OS進程并不能徹底清除鎖的
問題。?
========
Oracle鎖機制原理(深入剖析)
http://www.2cto.com/database/201309/240500.html?
庫用兩種類型的鎖,一種是共享鎖,另一種是排他鎖。在像表或是表中一行只能獲得一個排他鎖,但是
共享鎖可以再單個的資源中被多次獲得。
鎖影響讀和寫相互作用。下面的一些規則綜述了oracle數據庫關于讀和寫的一些行為:
? 1)僅當被寫操作編輯時一行記錄會被鎖定
當一條更新的命令更新一行是,這個事務就會只獲得這一行的鎖。通過鎖定在表中的這一條數據層次面
,這個數據庫會很小的爭奪對這個共享數據來說。正常情況下,數據庫不會逐漸升級為對這個塊的行鎖
或是到一個表鎖的等級。
? 2)只能在同一時間對一個數據塊進行寫入:
如果一個事務編輯表中的一行記錄,那么這個行鎖就會阻止其他事務同時對同一行的元組進行編輯。
? 3)讀永遠不會妨礙寫
因為讀一行數據不會進行對它枷鎖,另一個事務可以同時對同一行進行編輯。這個當然除了select 。。
。from update這個語句之外,這個select是一個很特別的語句不會在它讀的時候鎖住一行數據。
? 4)寫的時候不影響讀
當一行數據被寫入改變的時候,這個數據庫會使用undo date去提供讀取一致的行數據。
三)鎖的使用
在一個單用戶數據庫中,鎖就不需要了因為只有一個用戶去編輯信息。然而,當多用戶去訪問和編輯數
據時,這個數據庫必須提供一種方式去阻止去并發的編輯相同的數據。鎖機制達到下面非常重要的數據
庫的一些要求:
? 1)一致性
?一個數據的session必須可見和改變數據但是不能被其他的session進行改變數據直到這個用戶完成了操
作。
? 2)完整性
在正確修改序列時這個數據和數據結構必須反映所有操作的改變
在事務通過它們鎖機制中oracle數據庫提供了數據的并發性、一致性、完整性。鎖是自動執行的不需要
用戶操作。
?當并發更新一行的時候,會說明需要什么要的鎖。在下面的例子中,一個簡單的web應用顯示最終用戶
的雇員郵箱和電話號碼。這個應用使用update語句像下面這樣編輯數據:
?
[sql]
eg: ?
update employees ?
set email=? ,phone_number=? ?
where employee_id=? ?
and email=? ?
and phone_number=?
?
在update語句執行前,這個郵箱和電話號碼值都是where字句之前的,沒有對指定employee編輯之前的值
。這個update確保這行記錄在被應用最后讀和顯示給用戶不會改變。通過這個方式,這個應用避免失去
update數據的問題,當一個用戶查看時卻別其他用戶編輯了.(也就是說不會出現臟讀的情況)。
?
當執行sql語句的時候oracle數據庫會自動獲得所需要的鎖。例如,當一個數據庫允許一個會話去編輯一
個數據,這個會話必須首先鎖定這個數據。這個鎖能夠給這個session排斥其他的事務對這個數據進行鎖
定并修改,直到這個鎖被釋放掉。
因為這個鎖的機制,數據庫被事務控制聯系緊密,應用開發者都會需要定義一些事務的特性,然后數據
庫會自動的管理鎖機制。用戶從來不需要鎖定許多明確的資源,當然了oracle數據庫也允許用戶手動去
鎖定一些資源。
四)鎖的模式
oracle數據自動使用最底的鎖應用等級限制去最大程度上提供更高的并發性和數據的性。限制越低,就
能更好的提供數據被其他用戶所訪問。相反越高的限制等級就會限制其他用戶事務獲取他們所需要的數
據。
oracle數據庫在多用戶數據庫中使用兩中類型的鎖(數據庫可以使用startup restrict命令啟動到一個
特權模式下,在該模式下只用特定權限的用戶才可以訪問數據庫)
? 1)排他鎖模式
?在這種模式下阻止數據被共享。當一個事務編輯數據的時候就會獲得一個排他鎖。第一個事務鎖定了一
個這個數據,那么只有他可以進行修改,其他用戶如需在修改這個數據,那么必須等第一個事務修改完
成釋放了排他鎖。
? 2)共享鎖模式
這個模式基于操作有關信息允許這個資源被共享。多個用戶讀取數據的時候會共享這個數據,持有共享
鎖去一個需要獲得排他鎖的用戶并發訪問。幾個事務能夠在相同的數據資源中取得共享鎖。
假設一個事務使用select 。。。for update 語句去選擇單表的一行。那么這個事務會獲得一個行級共
享排他鎖。這個行鎖允許其他的會話修改一些其他行,在這個表鎖定的時候阻止會話去修改這個數據的
結構。因此數據庫提供了很多語句去執行。?
?
?五)鎖的轉化和升級
當必要時,oracle會執行鎖的轉化操作。在鎖的轉化中,oracle會自動的轉換一個表鎖從較低的限制到
一個較高的限制。
例如。假設一個事務對employee表執行一個select 。。。for update然后更新鎖住的行。在這種情況下
數據庫會自動轉換從一個表的行級共享鎖到一個表的行級排他鎖。在這個事務中這個事務獲得行級排他
鎖來完成所有數據行的插入、更新或是刪除操作。因為行鎖獲取的是最高的約束程度,因此沒有其他鎖
的轉化被獲得或是去執行。
鎖的轉化與鎖的升級是不同的,鎖的轉化在許多鎖從一個很低的粒度到一個很高的粒度重現。如果一個
用戶在一個表中鎖定了很多的行,然后一下數據庫自動的升級這個行鎖到一個這個行所屬表鎖。那么鎖
的數量會變小,但是約束的程度會增大。
oracle數據庫從來都不會升級鎖。鎖的升級很大程度上會發生思鎖。建設一個系統試著為了事務1升級鎖
是不可行的因為這個鎖被事務2持有了。這時當事務2也請求同意個數據被升級一個鎖的時候死鎖就產生
了。
六)鎖的持續
當像一個事務不在需要這個資源這種事件發生的時候,oracle數據庫會自動的釋放鎖。在大多數情況下
,在事務持續期間oracle數據庫會通過事務的語句持有相應的鎖。這些鎖阻止并發事務的相互干啥,如
可能產生的臟讀、不可重復讀、和幻想讀情況。
========
ORACLE關于鎖和V$LOCK的分析
http://blog.itpub.net/26770925/viewspace-1293245/? ? 為了實現并發,oracle數據庫使用了鎖機制。要了解鎖,首先要了解視圖v$lock。
v$lock這個視圖列出 Oracle 服務器當前擁有的鎖以及未完成的鎖請求。如果你覺著 session 處于等待
事件隊列當中,那你應該檢查視圖v$lock。
v$lock中的常用列有以下列:
? ? ?sid:持有鎖的會話SID,通常與v$session關聯。
? ? ?type:鎖的類型,其中TM表示表鎖或DML鎖,TX表示行鎖或事務鎖,UL表示用戶鎖。我們主要關注
TX和TM兩種型的鎖,其它均為系統鎖,會很快自動釋放,不用關注。當 Oracle執行 DML 語句時,系統
自動在所要操作的表上申請 TM 類型的鎖。當 TM鎖獲得后,系統再自動申請 TX 類型的鎖,并將實際鎖
定的數據行的鎖標志位進行置位。TM 鎖包括了SS 、 SX、 S 、X 等多種模式,在數據庫中用 0 -6 來
表示。不同的 SQL 操作產生不同類型的 TM鎖。
? ? ?lmode:會話保持的鎖的模式。
? ? ? ? ? 0=None;
? ? ? ? ? 1=Null ;
? ? ? ? ? 2=Row-S (SS,行級共享鎖,其他對象只能查詢這些數據行),sql操作有select for update
、lock for update、lock row share;
? ? ? ? ? 3=Row-X (SX,行級排它鎖,在提交前不允許做DML操作),sql操作有insert、update、delete
、lock row share;
? ? ? ? ? 4=Share(共享鎖),sql操作有create index、lock share;
? ? ? ? ? 5=S/Row-X (SSX,共享行級排它鎖),sql操作有lock share row exclusive;
? ? ? ? ? 6=Exclusive(排它鎖),alter table、drop table、drop index、truncate table、look?
exclusive等DDL
? ? ?ID1,ID2: ?ID1,ID2的取值含義根據type的取值而有所不同,對于TM 鎖ID1表示被鎖定表的
object_id 可以和dba_objects視圖關聯取得具體表信息,ID2 值為0;對于TX 鎖ID1以十進制數值表示
該事務所占用的回滾段號和事務槽slot number號,其組形式: 0xRRRRSSSS,RRRR=RBS/UNDO?
NUMBER,SSSS=SLOT NUMBER,ID2 以十進制數值表示環繞wrap的次數,即事務槽被重用的次數。實際上這
兩個字段構成了事務在回滾段中的位置。
當鎖產生時,以下圖為例說明v$lock:
1、圖中存在兩個session分別是133和135,session135的BLOCK=1意味著該session擁有一個鎖,并阻塞
了其他session的對該鎖的請求。該鎖的類型由TY定義,模式由LMODE字段定義;
2、session133的request=6說明該session正在等待一個lmode為6的鎖,而該鎖的擁有者正是session135
。
3、對于TM鎖,ID1Z值就是加鎖的段對象,可以是表或者表分區,此時ID2一般為0;對于TX鎖,這兩個字
段構成該事務在回滾段中的位置。
對于死鎖的處理流程:
1,查找鎖:
select ls.osuser os_user_name,
ls.username user_name,
ls.type lock_type,
o.object_name object,
decode(ls.lmode,1,null,2,'Row Share',3,'Row Exclusive',4,'Share',5,'Share Row?
Exclusive',6,'Exclusive',null) lock_mode,
o.owner,
ls.sid,
ls.serial# serial_num,
ls.id1,ls.id2,
ls.paddr
?from sys.dba_objects o,
(select s.osuser,s.username,l.type,s.paddr,l.lmode,s.sid,s.serial#,l.id1,l.id2 ?from v
$session s,v$lock l where s.sid=l.sid) ls
where o.object_id=ls.id1 and o.owner<>'SYS' order by o.owner,o.object_name
2,查找spid
select a.spid,a.username,b.program ?from v$process a,v$session b where a.addr=b.paddr and?
a.addr='000007FF2DC8E578';
3、kill進程
alter system kill session 'sid,serial#' immediate;
orakill sid spid
sid:表示要殺死的進程屬于的實例名
thread:是要殺掉的線程號,即第2步查詢出的spid。?
========
總結
以上是生活随笔為你收集整理的ORACLE锁学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ boost 实例学习
- 下一篇: VS2010插件编写学习总结