『壹』 Oracle資料庫鎖的常用類型有哪些
此文章主要是對Oracle資料庫鎖機制的詳細研究 首先我們要介紹的是Oracle資料庫鎖的類型 同時也闡述 在實際應用中我們經常會遇到的與鎖相關的異常情況 特別對經常遇到的由於等待鎖而使事務被掛起的問題進行了定位及解決 並對死鎖這一比較嚴重的現象 提出了相應的解決方法和具體的分析過程
資料庫是一個多用戶使用的共享資源 當多個用戶並發地存取數據時 在資料庫中就會產生多個事務同時存取同一數據的情況 若對並發操作不加控制就可能會讀取和存儲不正確的數據 破壞資料庫的一致性
加鎖是實現資料庫並發控制的一個非常重要的技術 當事務在對某個數據對象進行操作前 先向系統發出請求 對其加鎖 加鎖後事務就對該數據對象有了一定的控制 在該事務釋放鎖之前 其他的事務不能對此數據對象進行更新操作
在資料庫中有兩種基本的鎖類型 排它鎖(Exclusive Locks 即X鎖)和共享鎖(Share Locks 即S鎖) 當數據對象被加上排它鎖時 其他的事務不能對它讀取和修改 加了共享鎖的數據對象可以被其他事務讀取 但不能修改 資料庫利用這兩種基本的鎖類型來對Oracle資料庫的事務進行並發控制
在實際應用中經常會遇到的與鎖相關的異常情況 如由於等待鎖事務被掛起 死鎖等現象 如果不能及時地解決 將嚴重影響應用的正常執行 而目前對於該類問題的解決缺乏系統化研究和指導 本文在總結實際經驗的基礎上 提出了相應的解決方法和具體的分析過程
Oracle資料庫的鎖類型
根據保護的對象不同 Oracle資料庫鎖可以分為以下幾大類 DML鎖(data locks 數據鎖) 用於保護數據的完整性 DDL鎖(dictionary locks 字典鎖) 用於保護資料庫對象的結構 如表 索引等的結構定義 內部鎖和閂(internal locks and latches) 保護資料庫的內部結構
DML鎖的目的在於保證並 *** 況下的數據完整性 本文主要討論DML鎖 在Oracle資料庫中 DML鎖主要包括TM鎖和TX鎖 其中TM鎖稱為表級鎖 TX鎖稱為事務鎖或行級鎖
當Oracle執行DML語句時 系統自動在所要操作的表上申請TM類型的鎖 當TM鎖獲得後 系統再自動申請TX類型的鎖 並將實際鎖定的數據行的鎖標志位進行置位 這樣在事務加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標志 而只需檢查TM鎖模式的相容性即可 大大提高了系統的效率
TM鎖包括了SS SX S X等多種模式 在Oracle資料庫中用 - 來表示 不同的SQL操作產生不同類型的TM鎖 如表 所示
在數據行上只有X鎖(排他鎖) 在 Oracle資料庫中 當一個事務首次發起一個DML語句時就獲得一個TX鎖 該鎖保持到事務被提交或回滾 當兩個或多個會話在表的同一條記錄上執行DML語句時 第一個會話在該條記錄上加鎖 其他的會話處於等待狀態 當第一個會話提交後 TX鎖被釋放 其他會話才可以加鎖
當Oracle資料庫發生TX鎖等待時 如果不及時處理常常會引起Oracle資料庫掛起 或導致死鎖的發生 產生ORA 的錯誤 這些現象都會對實際應用產生極大的危害 如長時間未響應 大量事務失敗等
TX鎖等待的分析
在介紹了有關地Oracle資料庫鎖的種類後 下面討論如何有效地監控和解決鎖等待現象 及在產生死鎖時如何定位死鎖的原因
監控鎖的相關視圖 數據字典是Oracle資料庫的重要組成部分 用戶可以通過查詢數據字典視圖來獲得資料庫的信息 和鎖相關的數據字典視圖如表 所示
TX鎖等待的監控和解決在日常工作中 如果發現在執行某條SQL時資料庫長時間沒有響應 很可能是產生了TX鎖等待的現象 為解決這個問題 首先應該找出持鎖的事務 然後再進行相關的處理 如提交事務或強行中斷事務
死鎖的監控和解決在資料庫中 當兩個或多個會話請求同一個資源時會產生死鎖的現象 死鎖的常見類型是行級鎖死鎖和頁級鎖死鎖 Oracle資料庫中一般使用行級鎖 下面主要討論行級鎖的死鎖現象
當Oracle檢測到死鎖產生時 中斷並回滾死鎖相關語句的執行 報ORA 的錯誤並記錄在Oracle資料庫的日誌文件alertSID log中 同時在user_mp_dest下產生了一個跟蹤文件 詳細描述死鎖的相關信息
在日常工作中 如果發現在日誌文件中記錄了ora 的錯誤信息 則表明產生了死鎖 這時需要找到對應的跟蹤文件 根據跟蹤文件的信息定位產生的原因
如果查詢結果表明 死鎖是由於bitmap索引引起的 將IND_T_PRODUCT_HIS_STATE索引改為normal索引後 即可解決死鎖的問題
表 Oracle的TM鎖類型
鎖模式 鎖描述 解釋 SQL操作
none
NULL 空 Select
SS(Row S) 行級共享鎖 其他對象只能查詢這些數據行 Select for update Lock for update Lock row share
SX(Row X) 行級排它鎖 在提交前不允許做DML操作 Insert Update Delete Lock row share
S(Share) 共享鎖 Create index Lock share
SSX(S/Row X) 共享行級排它鎖 Lock share row exclusive
lishixin/Article/program/Oracle/201311/18509
『貳』 排他鎖與共享鎖的區別
排他鎖是針對資料庫的「寫鎖」;共享鎖又叫「S鎖」由非更新(讀取)操作創建的鎖。其他用戶可以並發讀取數據,但任何事務都不能獲取數據上的排它鎖,直到已釋放所有共享鎖。
『叄』 資料庫鎖表是什麼意思
1、資料庫鎖表的意思:因為在資料庫里,同一個數據可能有多個人來讀取或更改,為了防止我更改的時候別人也同時更改,這是一般要鎖住表不讓別人改。
2、舉個簡單例子:在更新資料庫記錄的過程中,我是不希望別人也來更新我的這些記錄的,像庫存,做出庫的時候,原數量100,我出了20,我就需要把數量更新到80;
在更新的過程中,別人又做了30的出庫,如果在我更新的時候,別人先把庫存更新到70,然後我又更新80,那數量就錯誤了。所以我更新的時候,我就需要鎖定這條記錄。這是數據行鎖,排他鎖。
(3)無法獲得資料庫model上的排他鎖擴展閱讀:
資料庫鎖表的必要條件:
1)互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用。如果此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放。
2)請求和保持條件:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放。
3)不剝奪條件:指進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
4)環路等待條件:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。