鎖的種類,阻塞,死鎖產生與解決辦法。
TM鎖的種類:
TM鎖幾種模式的互斥關係:
阻塞
定義:
當一個會話保持另一個會話正在請求的資源上的鎖定時,就會發生阻塞。被阻塞的會話將一直掛起,直到持有鎖的會話放棄鎖定的資源為止。4個常見的dml語句會產生阻塞
INSERT
UPDATE
DELETE
SELECT…FOR UPDATE
——————————————————————————————————————————————————————————————
update 的阻塞 試驗:
1. 獲得會話sid
SQL> select sid from v$mystat where rownum=1; (首先update的會話sid)
SID
----------
1
SQL> select sid from v$mystat where rownum=1; (隨後update的會話sid)
SID
----------
39
2. 操作表
SQL> select * from andy; (檢視操作表)
ID
----------
1
SQL> update andy set id=2 where id=1; (首先,會話sid為1的update)
1 row updated.
SQL> update andy set id=2 where id=1; (隨後,會話sid為39的update,執行後,發現被阻塞)
3. 檢視會話鎖衝突
SQL> select sid,type,lmode,id1,id2,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY LMODE ID1 ID2 REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
1 TM 3 79729 0 0 0
1 TX 6 131072 1276 0 1
39 TM 3 79729 0 0 0
39 TX 0 131072 1276 6 0
解釋說明:
SID:表示會話sid。
TY:表示鎖的型別。
ID1:在TM一行中表示的是被修改表的標識(object_id)。
ID1:在TX一行中表示以十進位制數值表示該事務所佔用的回滾段號與該事務在該回滾段的事務表(Transaction table)中所佔用的槽號(slot number,可理解為記錄號)。其組成形式為: 0xRRRRSS 如: 1 TX 6 131072 1276 0 1
REQUEST:0表示的是已經獲得鎖。非0表示被阻塞,請求獲得鎖。 如:sid為1的會話,先update andy set id=2 where id=1;獲得該行的TX鎖,但為提交。然後sid為39的會話,再次andy set id=2 where id=1;請求獲得該行的TX鎖,但是該行TX鎖被sid為1的會話佔用,所以未獲得該說,被阻塞,只能等待(sid為1提交與自己回滾)。
BLOCK:
指示是否鎖問題正在阻塞其他程式。可能的值是:
0 - The lock is not blocking any other processes
1 - The lock is blocking other processes
2 - The lock is not blocking any blocked processes on the local node, but it may or may not be blocking processes on remote nodes. This value is used only in Oracle Real Application Clusters (Oracle RAC) configurations (not in single instance configurations).
-- 驗證 TM一行中表示的是被修改表的標識(object_id)。(確實如此)
SQL> select object_name from dba_objects where object_id=79729;
OBJECT_NAME
--------------------------------------------------------------------------------
ANDY
至此,阻塞試驗完畢。
查詢會話之間鎖等待的關係
select a.sid holdsid,b.sid waitsid,a.type ,a.id1,a.id2,a.ctime from v$lock a,v$lock b
where a.id1=b.id1 and a.id2=b.id2 and a.block = 1 and b.block = 0 ;
HOLDSID WAITSID TY ID1 ID2 CTIME
---------- ---------- -- ---------- ---------- ----------
1 39 TX 458777 1066 503
1 51 TX 458777 1066 503
查被阻塞的會話
select * from v$lock where lmode=0 and type in ('TM','TX');
——————————————————————————————————————————————————————————
死鎖-deadlock
定義:當兩個使用者希望持有對方的資源時就會發生死鎖.
即兩個使用者互相等待對方釋放資源時,oracle認定為產生了死鎖,在這種情況下,將以犧牲一個使用者作為代價,另一個使用者繼續執行,犧牲的使用者的事務將回滾.
例子:
1:使用者1對A表進行Update,沒有提交。
2:使用者2對B表進行Update,沒有提交。
此時雙反不存在資源共享的問題。
3:如果使用者2此時對A表作update,則會發生阻塞,需要等到使用者一的事物結束。
4:如果此時使用者1又對B表作update,則產生死鎖。此時Oracle會選擇其中一個使用者進行會滾,使另一個使用者繼續執行操作。
起因:
Oracle的死鎖問題實際上很少見,如果發生,基本上都是不正確的程式設計造成的,經過調整後,基本上都會避免死鎖的發生。
死鎖試驗:
SQL> select * from andy;
ID
----------
3
2
SQL> delete andy where id=2; (會話1)
1 row deleted.
SQL> delete andy where id=3; (會話2)
1 row deleted.
SQL> delete andy where id=3; (會話1)
delete andy where id=3
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
SQL> delete andy where id=2; (會話2,阻塞狀態)
死鎖產生後,處理辦法:
1)執行下面SQL,先檢視哪些表被鎖住了:
>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;
2)檢視引起死鎖的會話
>select b.username,b.sid,b.serial#,logon_time
18:09:40 2 from v$locked_object a,v$session b
18:09:40 3 where a.session_id = b.sid order by b.logon_time;
3)檢視被阻塞的會話
>select * from dba_waiters;
4)可以提交或回滾阻塞的話,釋放鎖或者殺掉ORACLE程式:
ALTER SYSTEM KILL SESSION 'SID,SERIAL#';
說明:
如果殺掉所有死鎖相關的會話,則所有會話的事務回滾,相當於事務都為未執行。
如果殺掉報ORA-00060: deadlock detected while waiting for resource的會話,阻塞會話commit,阻塞會話將完成該會話的所有事務。
如果殺掉被阻塞的會話,報ORA-00060會話commit,則完成的事務是未產生死鎖之前的事務。
如果報ORA-00060: deadlock detected while waiting for resource的會話進行rollback,阻塞會話commit,阻塞會話將完成該會話所有事務。
ok,結束。 轉載請標明出處。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2131250/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (資料庫十)資料庫中的鎖機制以及死鎖產生的原因及解決辦法資料庫
- 【Oracle】死鎖的產生與處理Oracle
- SqlServer鎖表解鎖解決辦法SQLServer
- ORA-00060: Deadlock detected 模擬死鎖產生與解決方案
- MySQL死鎖分析與解決之路MySql
- MySQL 死鎖解決MySql
- MySQL解決死鎖MySql
- synchronized 內部原理、常見鎖策略、CAS、 以及死鎖的產生和解決synchronized
- 面試:什麼是死鎖,如何避免或解決死鎖;MySQL中的死鎖現象,MySQL死鎖如何解決面試MySql
- 例項詳解 Java 死鎖與破解死鎖Java
- 【分散式鎖的演化】常用鎖的種類以及解決方案分散式
- 作業系統(5) 死鎖的概念 死鎖產生的必要條件 死鎖的處理策略 預防死鎖 避免死鎖 死鎖的檢測和解除 銀行家演算法作業系統演算法
- 鎖的使用與死鎖的避免
- [翻譯]:SQL死鎖-阻塞探測SQL
- 什麼是死鎖?如何解決死鎖?
- 記一次Oracle死鎖/阻塞排查Oracle
- 併發程式設計之臨界區\阻塞\非阻塞\死鎖\飢餓\活鎖程式設計
- java多執行緒:執行緒同步synchronized(不同步的問題、佇列與鎖),死鎖的產生和解決Java執行緒synchronized佇列
- SQL SERVER死鎖查詢,死鎖分析,解鎖,查詢佔用SQLServer
- 解決Oracle死鎖問題步驟Oracle
- mysql慢查詢,死鎖解決方案MySql
- MySQL鎖等待與死鎖問題分析MySql
- Java中常見死鎖與活鎖的例項Java
- 死鎖問題排查過程-間隙鎖的復現以及解決
- 常見的死鎖情況及解決方法
- synchronized類鎖與物件鎖synchronized物件
- 使用SVN提示“工作副本已經鎖定”的解決辦法 .
- Mysql使用kill命令解決死鎖問題MySql
- 自旋鎖、阻塞鎖、可重入鎖、悲觀鎖、樂觀鎖、讀寫鎖、偏向所、輕量級鎖、重量級鎖、鎖膨脹、物件鎖和類鎖物件
- 詳解 MySql InnoDB 中的三種行鎖(記錄鎖、間隙鎖與臨鍵鎖)MySql
- 死鎖
- SQLServer的死鎖分析(1):頁鎖SQLServer
- Python | 淺談併發鎖與死鎖問題Python
- 死鎖和可重入鎖
- MySQL 死鎖和鎖等待MySql
- Ubuntu 報錯:無法獲得鎖 /var/lib/dpkg/lock解決辦法Ubuntu
- 故障解析丨一次死鎖問題的解決
- S 鎖與 X 鎖的愛恨情仇《死磕MySQL系列 四》MySql
- 面試官:什麼是死鎖?怎麼排查死鎖?怎麼避免死鎖?面試