熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle數據庫鎖的常用類型有哪些

2013-11-13 22:13:06  來源: 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鎖包括了SSSXSX等多種模式在Oracle數據庫中用來表示不同的SQL操作產生不同類型的TM鎖如表所示

  在數據行上只有X鎖(排他鎖)在 Oracle數據庫中當一個事務首次發起一個DML語句時就獲得一個TX鎖該鎖保持到事務被提交或回滾當兩個或多個會話在表的同一條記錄上執行DML語句時第一個會話在該條記錄上加鎖其他的會話處於等待狀態當第一個會話提交後TX鎖被釋放其他會話才可以加鎖

  當Oracle數據庫發生TX鎖等待時如果不及時處理常常會引起Oracle數據庫掛起或導致死鎖的發生產生ORA的錯誤這些現象都會對實際應用產生極大的危害如長時間未響應大量事務失敗等

  TX鎖等待的分析

  在介紹了有關地Oracle數據庫鎖的種類後下面討論如何有效地監控和解決鎖等待現象及在產生死鎖時如何定位死鎖的原因

  監控鎖的相關視圖 數據字典是Oracle數據庫的重要組成部分用戶可以通過查詢數據字典視圖來獲得數據庫的信息和鎖相關的數據字典視圖如表所示

  TX鎖等待的監控和解決在日常工作中如果發現在執行某條SQL時數據庫長時間沒有響應很可能是產生了TX鎖等待的現象為解決這個問題首先應該找出持鎖的事務然後再進行相關的處理如提交事務或強行中斷事務

  死鎖的監控和解決在數據庫中當兩個或多個會話請求同一個資源時會產生死鎖的現象死鎖的常見類型是行級鎖死鎖和頁級鎖死鎖Oracle數據庫中一般使用行級鎖下面主要討論行級鎖的死鎖現象

  當Oracle檢測到死鎖產生時中斷並回滾死鎖相關語句的執行報ORA的錯誤並記錄在Oracle數據庫的日志文件alertSIDlog中同時在user_dump_dest下產生了一個跟蹤文件詳細描述死鎖的相關信息

  在日常工作中如果發現在日志文件中記錄了ora的錯誤信息則表明產生了死鎖這時需要找到對應的跟蹤文件根據跟蹤文件的信息定位產生的原因

  如果查詢結果表明死鎖是由於bitmap索引引起的將IND_T_PRODUCT_HIS_STATE索引改為normal索引後即可解決死鎖的問題

   Oracle的TM鎖類型

  鎖模式 鎖描述 解釋 SQL操作

   none

   NULL 空 Select

   SS(RowS) 行級共享鎖其他對象只能查詢這些數據行 Select for updateLock for updateLock row share

   SX(RowX) 行級排它鎖在提交前不允許做DML操作 InsertUpdateDeleteLock row share

   S(Share) 共享鎖 Create indexLock share

   SSX(S/RowX) 共享行級排它鎖 Lock share row exclusive

   X(Exclusive) 排它鎖 Alter tableDrop ableDrop indexTruncate table Lock exclusive


From:http://tw.wingwit.com/Article/program/Oracle/201311/18509.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.