一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Oracle - 簡單說明Oracle數據庫中對死鎖的查詢及解決方法

簡單說明Oracle數據庫中對死鎖的查詢及解決方法

2019-12-25 14:25董斌 Oracle

這篇文章主要介紹了Oracle數據庫中對死鎖的查詢及解決方法,文中用兩個表創造死鎖的簡單例子來說明對死鎖的撤銷方法,需要的朋友可以參考下

死鎖的原理
當對于數據庫某個表的某一列做更新或刪除等操作,執行完畢后該條語句不提
交,另一條對于這一列數據做更新操作的語句在執行的時候就會處于等待狀態,
此時的現象是這條語句一直在執行,但一直沒有執行成功,也沒有報錯。 
 
死鎖的定位方法
通過檢查數據庫表,能夠檢查出是哪一條語句被死鎖,產生死鎖的機器是哪一臺。
 
1)用dba用戶執行以下語句

?
1
2
select username,lockwait,status,machine,program from v$session where sid in
(select session_id from v$locked_object)

如果有輸出的結果,則說明有死鎖,且能看到死鎖的機器是哪一臺。字段說明:

  • Username:死鎖語句所用的數據庫用戶;
  • Lockwait:死鎖的狀態,如果有內容表示被死鎖。
  • Status: 狀態,active表示被死鎖
  • Machine: 死鎖語句所在的機器。
  • Program: 產生死鎖的語句主要來自哪個應用程序。 

 
2)用dba用戶執行以下語句,可以查看到被死鎖的語句。

?
1
2
3
select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))

死鎖的解決例子
死鎖在Oracle中處理時,會自動事務相關的DML語句撤銷。換句話說,就是Oracle對于死鎖 問題的處理時一個主動的過程,會主動切斷其中一個session的事務鎖。

先來看一個簡單的死鎖案例。

我們創建兩個表lock_test1,lock_test2,然后使用兩個session來說明。

session1:

首先在session1中先創建兩個表,lock_test1,lock_test2

?
1
2
3
4
5
6
7
n1@TEST11G> create table lock_test1 as select *from cat;
 
Table created.
 
n1@TEST11G> create table lock_test2 as select *from cat;                    
 
Table created.

然后嘗試對lock_test1做delete操作。

?
1
2
3
n1@TEST11G> delete from lock_test1;
 
20 rows deleted.

session2:

然后切換到session2,對lock_test2做delete操作。

?
1
2
3
n1@TEST11G> delete from lock_test2;
 
21 rows deleted.

緊接著,在session1中對lock_test2做delete操作,這個時候出現阻塞的情況,一直沒有響應。

session1:

?
1
n1@TEST11G> delete from lock_test2;

 

我們在session2中,繼續對表Lock_test1做delete操作,這個時候會有短暫的停頓,就會發現session1中的事務被強行撤銷了。

session2:

?
1
n1@TEST11G> delete from lock_test1;

session1中的日志如下,可以看到這個時候session1中的事務被強行撤銷了。

?
1
2
3
4
5
6
7
8
9
n1@TEST11G> delete from lock_test2;
 
delete from lock_test2
 
      *
 
ERROR at line 1:
 
ORA-00060: deadlock detected while waiting for resource

這個問題可以簡單用下面的步驟來說明。

  • Session a  table1
  • Session b  table2
  • Session a  table 2
  • Session b  table1

到此為止我們可以看到,死鎖產生的影響是很大的,當然,問題還不止于此,在多個表之間很可能存在死鎖現象,對于一個表,也有可能出現死鎖現象。

我們來簡單說明示例一下。

session1:

?
1
2
3
4
5
create table test as select *from user_tables;
 
n1@TEST11G> delete from test where table_name='LOCK_TEST1';
 
1 row deleted.

session2:

?
1
2
3
4
5
6
7
n1@TEST11G> DELETE FROM TEST WHERE TABLE_NAME='LOCK_TEST2';
 
1 row deleted.
 
session1:
 
n1@TEST11G> DELETE FROM TEST WHERE TABLE_NAME='LOCK_TEST2';

session2:

?
1
n1@TEST11G> DELETE FROM TEST WHERE TABLE_NAME='LOCK_TEST1';

這個時候還是會出現一樣的死鎖問題,這個時候在對應的行上會有相應的鎖。在session2中會有短暫的停頓,然后把session1中的

給撤銷了,產生的日志如下:

?
1
2
3
4
5
6
7
DELETE FROM TEST WHERE TABLE_NAME='LOCK_TEST2'
 
 *
 
ERROR at line 1:
 
ORA-00060: deadlock detected while waiting for resource

可見死鎖的問題還是很容易產生的,在編程中處理多并發的處理時還是需要多多注意。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: evelynlin亚裔播放 | 亚洲国产自 | 色婷婷综合缴情综六月 | 歪歪漫画a漫入口 | pregnantxxx孕交 | 九九九九九热 | 免费理伦片手机在线播放 | 18美女光胸光屁屁洗澡 | 四虎comwww最新地址 | 大片毛片女女女女女女女 | 污黄在线观看 | 青青在线视频观看 | 麻豆自拍 | www.爱情岛论坛 | 无人影院在线播放视频 | 国产91在线免费 | 合欢视频免费 | 欧美s级人做人爱c视频 | 手机在线免费观看视频 | 91手机在线 | 亚州日韩精品AV片无码中文 | 国产我不卡 | 色婷婷综合缴情综六月 | 欧美日韩精品乱国产 | 免费十几分视频 | 无人在线视频高清免费观看动漫 | 天天摸天天操天天爽 | 91精品国产91热久久p | 憋尿调教绝望之岛 | 亚洲天堂视频在线观看免费 | 91精品久久 | jk制服白丝超短裙流白浆 | 午夜国产小视频 | 精品第一国产综合精品蜜芽 | 天天做天天爱天天爽综合网 | 91制片厂制作传媒网站破解 | 色悠久久久久综合网小说 | 日本最大的黄色网站 | 日韩在线1| 国产精品久久久久影院色老大 | 午夜AV国产欧美亚洲高清在线 |