死鎖的概念 什麼是死鎖呢? 其實我們生活中也有很多類似死鎖的例子。 我先舉一個生活中的例子:過年回家,父親買了一把水彈槍,兒子和侄子爭搶著要先玩,誰也不讓誰,拆開包裝後,一個搶了槍, 一個逮住了子彈和彈夾。兩個都爭著要先玩,但是都互不相讓。結果兩個人都玩不了。如果兒子要先玩,就必須讓侄子把子彈和彈夾... ...
死鎖的概念
什麼是死鎖呢? 其實我們生活中也有很多類似死鎖的例子。 我先舉一個生活中的例子:過年回家,父親買了一把水彈槍,兒子和侄子爭搶著要先玩,誰也不讓誰,拆開包裝後,一個搶了槍, 一個逮住了子彈和彈夾。兩個都爭著要先玩,但是都互不相讓。結果兩個人都玩不了。如果兒子要先玩,就必須讓侄子把子彈和彈夾給他,如果侄子要先玩,就必須讓兒子把槍給侄子。他們就這樣對峙了十幾分鐘,互不相讓。 我出來調停,讓兒子把槍先給侄子玩,每個人玩十分鐘。然後兩個人開開心心一起玩起來。其實這就是一個活生生的死鎖(Dead Lock)的例子。
我們再來看看資料庫死鎖的概念, 所謂死鎖,是指兩個會話,每個會話都持有另外一個會話想要的資源,因爭奪資源而造成的一種互相等待的現象,此時就會出現死鎖,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。Oracle對於“死鎖”採取的策略是回滾其中一個事務,讓另外一個事務順利進行。
英文關於deadlock的概念如下:
A deadlock occurs when a session (A) wants a resource held by another session (B) , but that session also wants a resource held by the first session (A). There can be more than 2 sessions involved but the idea is the same.
死鎖的模擬
上面瞭解了死鎖的概念,接下來,我們先人工構造一個簡單的死鎖(Dead Lock)案例來加深理解一下死鎖(Dead Lock),如下所示,我們先準備測試案例使用的表和數據,測試環境為Oracle Database 10g Release 10.2.0.5.0
SQL> create table dead_lock_test( id number(10), name varchar2(32));
Table created.
SQL> insert into dead_lock_test values(101, 'kerry');
1 row created.
SQL> insert into dead_lock_test values(102, 'ken');
1 row created.
SQL> commit;
Commit complete.
SQL>
在會話1(SID為788)中執行下麵SQL語句:
SQL> show user;
USER is "TEST"
SQL> select * from v$mystat where rownum=1;
SID STATISTIC# VALUE
---------- ---------- ----------
788 0 1
SQL> update dead_lock_test set name='kerry1_101' where id=101;
1 row updated.
SQL>
然後在會話2(SID為770)中執行下麵SQL語句:
SQL> show user;
USER 為 "TEST"
SQL> select * from v$mystat where rownum=1;
SID STATISTIC# VALUE
---------- ---------- ----------
770 0 1
SQL> update dead_lock_test set name='kerry2_102' where id=102;
已更新 1 行。
SQL> update dead_lock_test set name='kerry2_101' where id=101;
如上所示,會話2(SID為770)更新id=101這條記錄時,會話被阻塞了。然後我們在會話1(SID為788)中執行下麵SQL語句:
SQL> update dead_lock_test set name='kerry1_102' where id=102;
此時你會立馬看到會話2(SID為770)出現ORA-00060錯誤,如下所示:
如果對上面的操作過程的流程有點不直觀,那麼可以參下麵表格:
當然,如果你以下麵這樣的順序更新,那麼會話1就會出現ORA-0060的錯誤,會話1會被當做犧牲的會話進行回滾。
此時在告警日誌中就會出現trc文件。註意RAC環境和單機環境稍有不同。在RAC環境中,是由LMD(Lock Manager Daemon)進程統一管理各個節點之間的鎖資源的,所以,RAC環境中trace文件是由LMD進程來生成的。
Tue Mar 28 15:36:30 CST 2017
ORA-00060: Deadlock detected. More info in file /u01/app/oracle/admin/SCM2/bdump/scm2_s000_15815.trc
trace文件的部分內容如下所示: