摘 要:在網(wǎng)絡環(huán)境下,多數(shù)用戶可以通過數(shù)據(jù)庫來實現(xiàn)資源的共享。但是數(shù)據(jù)庫在處理大量的數(shù)據(jù)存取的過程中,有時候會出現(xiàn)死鎖的現(xiàn)象,產生這種現(xiàn)象的原因主要是由于用戶對程序的設計不正確導致,只有對程序進行重新的設計,才能夠避免這種現(xiàn)象的發(fā)生。本文主要是對Oracle數(shù)據(jù)庫死鎖現(xiàn)象進行了研究,并且提出了相關的建議。
關鍵詞:Oracle數(shù)據(jù)庫;死鎖;分析;研究
中圖分類號:TP311.13
對于數(shù)據(jù)庫系統(tǒng)來說,其應用系統(tǒng)的并發(fā)量十分大,在同一時間將會有很多用戶對數(shù)據(jù)庫進行訪問,這樣會導致數(shù)據(jù)庫發(fā)起鎖定請求,產生這種情況的原因主要是數(shù)據(jù)庫系統(tǒng)的程序設計不夠合理,若是不對其不加以處理,那么將會使死鎖現(xiàn)象頻繁出現(xiàn),嚴重影響系統(tǒng)的性能。在Oracle數(shù)據(jù)庫死鎖現(xiàn)象是一個十分普遍的問題,但是若是能夠正確的對程序進行設計,那么將會有效的避免這種現(xiàn)象的發(fā)生。數(shù)據(jù)庫在發(fā)生死鎖現(xiàn)象時候,系統(tǒng)會自動進行相應的檢測,但是在自動檢測時候,分析警告文件以及跟蹤文件時候將會耗費大量的時間,所以通常主要是利用SQL語句來監(jiān)測死鎖現(xiàn)象,根據(jù)Oracle數(shù)據(jù)庫所提供的視圖進行檢測
1 數(shù)據(jù)庫鎖機制以及鎖的類型
1.1 數(shù)據(jù)庫鎖機制
在相應的網(wǎng)絡環(huán)境之下,Oracle數(shù)據(jù)庫能夠允許多個用戶進行數(shù)據(jù)庫信息的同時訪問,這樣將會使數(shù)據(jù)庫中發(fā)生多個事務同時對于同一數(shù)據(jù)進行處理,這種現(xiàn)象又稱為并發(fā)操作,在Oracle數(shù)據(jù)庫中在出現(xiàn)這種并發(fā)現(xiàn)象時,若是不及時采取相應的措施進行控制,那么有可能造成數(shù)據(jù)庫的用戶讀取的信息數(shù)據(jù)錯誤,從而使數(shù)據(jù)庫遭到破壞。另外,為了能夠保證Oracle數(shù)據(jù)庫中的數(shù)據(jù)準確一致,那么必須要對其進行加鎖處理,這樣能夠保證數(shù)據(jù)庫中訪問的用戶的相對獨立性,在用戶對于數(shù)據(jù)庫中的數(shù)據(jù)信息進行操作時候,在操作之前必須要發(fā)出相應的請求,以此來對相應的事務進行加鎖處理,其他的事務要想對其進行處理那么必須要等到解鎖之后才能進行,這樣能夠有效的保證數(shù)據(jù)庫數(shù)據(jù)的一致性。
1.2 鎖的類型
根據(jù)數(shù)據(jù)庫中的保護對象,其中鎖類型主要可以分為兩種:(1)DML鎖,主要的作用是能夠保證數(shù)據(jù)的完整性,在Oracle數(shù)據(jù)庫中,DML鎖主要有兩種,TM鎖與TX鎖,前者是指表級鎖,而后者則是指事務鎖,在Oracle數(shù)據(jù)庫系統(tǒng)中,進行DML語句執(zhí)行的時候,系統(tǒng)將會自動申請TM鎖,在獲取之后,能夠對其位置進行標記。所以在進行事務的加鎖之前,不需要再去進行TX鎖相容性的檢測,僅僅是檢查TM鎖的兼容性,這樣能夠有效的提高Oracle數(shù)據(jù)庫系統(tǒng)的效率;(2)DDL鎖,這種鎖主要是用于對數(shù)據(jù)庫對象結構的保護,對表中以及索引中的結構進行保護[1]。
2 Oracle數(shù)據(jù)庫死鎖現(xiàn)象產生的原因
若是對程序處理的不好,那么Oracle數(shù)據(jù)庫將會發(fā)生死鎖現(xiàn)象[2]。而死鎖現(xiàn)象產生的原因可以分為:(1)用戶甲在訪問表一時,會對表一進行加鎖,然后再去訪問表二,但是用戶乙卻先訪問的表二,并且對表二進行加鎖,之后再返回去訪問表一。但是由于用戶乙已經(jīng)將表二加鎖,因此用戶甲必須要等到用戶乙將表二解鎖,才能夠繼續(xù)訪問,而用戶乙必須要等到用戶甲對表一進行解鎖,才能夠進行訪問,這種現(xiàn)象便是死鎖現(xiàn)象;(2)用戶甲在查詢系統(tǒng)對表中的記錄進行查詢時,會對其進行修改,但是用戶乙也在進行同一條記錄的修改,而且用戶甲將該記錄的鎖由共享鎖上升為獨占鎖,然而由于有用戶甲獨占鎖的存在,所以用戶乙的獨占鎖必須要等到用戶甲放掉共享鎖之后才能進行,但是用戶甲卻是由于用戶乙的獨占鎖而無法釋放自己的共享鎖,這樣也會造成死鎖現(xiàn)象;(3)在Oracle數(shù)據(jù)庫系統(tǒng)中,有時會執(zhí)行多個不滿足條件的update語句,那么系統(tǒng)將會進行全面的掃描,自動將行級別鎖上升到表級別鎖,從而造成死鎖現(xiàn)象;(4)在Oracle數(shù)據(jù)庫中數(shù)據(jù)量過于的龐大,但是相應的索引卻引建的很少,在進行全表掃描時候會出現(xiàn)死鎖現(xiàn)象。
3 Oracle數(shù)據(jù)庫死鎖現(xiàn)象的解決方式
3.1 Oracle數(shù)據(jù)庫自動檢測
Oracle數(shù)據(jù)庫系統(tǒng)將會對死鎖進行自動的檢測與相應的解決,在Oracle數(shù)據(jù)庫檢測到相應的死鎖時,將會將其記錄在日志中,因此必須要能夠經(jīng)常性的查看警告日志,主要是查看“ORA-00060”的相關的錯誤信息,若是出現(xiàn)那么說明Oracle數(shù)據(jù)庫出現(xiàn)了死鎖的現(xiàn)象。然后要能夠查看相應的跟蹤文件,以此來判斷出死鎖產生的原因,而這一過檢測程則主要利用SQL語句來實現(xiàn)。
3.2 利用SQL語句檢測死鎖
利用SQL來檢測死鎖的視圖,其中主要有五個相關的視圖,V$SESSION視圖、V$PROCESS視圖、V$LOCKED_OBJECT視圖、DBA_OBJECTS視圖以及V$ LOCK視圖,可以利用這些視圖來對Oracle數(shù)據(jù)庫中的死鎖現(xiàn)象進行檢測。
可以根據(jù)SQL語句進行Oracle數(shù)據(jù)庫系統(tǒng)中的死鎖現(xiàn)象的檢測,這些語句能夠檢測到相應的死鎖操作系統(tǒng)中的ID、鎖的類型以及各種鎖的模式等信息,并且鎖與鎖之間是否會阻塞申請也能夠被監(jiān)測到,其中關注最多的便是SESSION ID鎖,其中可以將語句進行相應的簡化:
在死鎖檢測之后,要對產生死鎖的機器進行相應的定位,主要是利用以下語句進行檢測:
利用這一語句進行死鎖產生的機器進行定位檢測,若是出現(xiàn)了輸出的結果,那么說明有死鎖,并且能夠看出出現(xiàn)死鎖的機器是哪一臺。
3.3 對于死鎖的解決方式
對死鎖進行解決的方式主要有兩種:(1)規(guī)避死鎖,Oracle數(shù)據(jù)庫中的死鎖問題主要是由于相關程序的設計不正確引起的,因此必須要對設計的方案進行相應的調整,從而來避免死鎖現(xiàn)象的產生。在檢測到死鎖之后,要將相關的程序關閉,以調查產生死鎖的主要原因,并且需要鎖定死鎖的位置,及時進行相應的處理,從而避免發(fā)生死鎖現(xiàn)象[3];(2)解除死鎖,主要是通過一些命令語句來解除死鎖,首先要能夠提交相應的事務,通過DBA來撤銷事務,并且能夠利用DBA進行解鎖與加鎖,然后利用ALETER DBATABSE KILL SESSION`SID,SERIAL語句來清除進程,最后利用KILL9 PROCESS來徹底清除死鎖進程。這種方式能夠解決死鎖問題,卻也存在很大的風險,所以對于死鎖的解決,最好是從程序設計優(yōu)化方面入手。
4 結束語
在Oracle數(shù)據(jù)庫中,會經(jīng)常發(fā)生死鎖現(xiàn)象,對于死鎖現(xiàn)象的處理,必須要先對產生死鎖的原因進行仔細的分析,并通過進行相應的檢測,實現(xiàn)這一問題的解決,而對系統(tǒng)程序進行優(yōu)化設計不失為一種有效地避免死鎖現(xiàn)象發(fā)生的方法。
參考文獻:
[1]姜文,劉立康.Oracle數(shù)據(jù)庫死鎖問題研究[J].計算機技術與發(fā)展,2011(01):40-41.
[2]周修廉.分布式數(shù)據(jù)庫系統(tǒng)死鎖問題研究[J].哈爾濱科學技術大學學報,2012(02):50-51.
[3]陳鵬.分布式數(shù)據(jù)庫死鎖檢測算法研究[J].重慶大學,2010(03):30-31.
作者單位:大連交通大學,大連 116045