此文章主要是對(duì)Oracle數(shù)據(jù)庫(kù)鎖機(jī)制的詳細(xì)研究 首先我們要介紹的是Oracle數(shù)據(jù)庫(kù)鎖的類(lèi)型 同時(shí)也闡述 在實(shí)際應(yīng)用中我們經(jīng)常會(huì)遇到的與鎖相關(guān)的異常情況 特別對(duì)經(jīng)常遇到的由于等待鎖而使事務(wù)被掛起的問(wèn)題進(jìn)行了定位及解決 并對(duì)死鎖這一比較嚴(yán)重的現(xiàn)象 提出了相應(yīng)的解決方法和具體的分析過(guò)程
創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)按需設(shè)計(jì)網(wǎng)站,是成都營(yíng)銷(xiāo)推廣公司,為成都陽(yáng)光房提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開(kāi)發(fā)等。成都網(wǎng)站設(shè)計(jì)熱線:13518219792
數(shù)據(jù)庫(kù)是一個(gè)多用戶(hù)使用的共享資源 當(dāng)多個(gè)用戶(hù)并發(fā)地存取數(shù)據(jù)時(shí) 在數(shù)據(jù)庫(kù)中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況 若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存儲(chǔ)不正確的數(shù)據(jù) 破壞數(shù)據(jù)庫(kù)的一致性
加鎖是實(shí)現(xiàn)數(shù)據(jù)庫(kù)并發(fā)控制的一個(gè)非常重要的技術(shù) 當(dāng)事務(wù)在對(duì)某個(gè)數(shù)據(jù)對(duì)象進(jìn)行操作前 先向系統(tǒng)發(fā)出請(qǐng)求 對(duì)其加鎖 加鎖后事務(wù)就對(duì)該數(shù)據(jù)對(duì)象有了一定的控制 在該事務(wù)釋放鎖之前 其他的事務(wù)不能對(duì)此數(shù)據(jù)對(duì)象進(jìn)行更新操作
在數(shù)據(jù)庫(kù)中有兩種基本的鎖類(lèi)型 排它鎖(Exclusive Locks 即X鎖)和共享鎖(Share Locks 即S鎖) 當(dāng)數(shù)據(jù)對(duì)象被加上排它鎖時(shí) 其他的事務(wù)不能對(duì)它讀取和修改 加了共享鎖的數(shù)據(jù)對(duì)象可以被其他事務(wù)讀取 但不能修改 數(shù)據(jù)庫(kù)利用這兩種基本的鎖類(lèi)型來(lái)對(duì)Oracle數(shù)據(jù)庫(kù)的事務(wù)進(jìn)行并發(fā)控制
在實(shí)際應(yīng)用中經(jīng)常會(huì)遇到的與鎖相關(guān)的異常情況 如由于等待鎖事務(wù)被掛起 死鎖等現(xiàn)象 如果不能及時(shí)地解決 將嚴(yán)重影響應(yīng)用的正常執(zhí)行 而目前對(duì)于該類(lèi)問(wèn)題的解決缺乏系統(tǒng)化研究和指導(dǎo) 本文在總結(jié)實(shí)際經(jīng)驗(yàn)的基礎(chǔ)上 提出了相應(yīng)的解決方法和具體的分析過(guò)程
Oracle數(shù)據(jù)庫(kù)的鎖類(lèi)型
根據(jù)保護(hù)的對(duì)象不同 Oracle數(shù)據(jù)庫(kù)鎖可以分為以下幾大類(lèi) DML鎖(data locks 數(shù)據(jù)鎖) 用于保護(hù)數(shù)據(jù)的完整性 DDL鎖(dictionary locks 字典鎖) 用于保護(hù)數(shù)據(jù)庫(kù)對(duì)象的結(jié)構(gòu) 如表 索引等的結(jié)構(gòu)定義 內(nèi)部鎖和閂(internal locks and latches) 保護(hù)數(shù)據(jù)庫(kù)的內(nèi)部結(jié)構(gòu)
DML鎖的目的在于保證并 *** 況下的數(shù)據(jù)完整性 本文主要討論DML鎖 在Oracle數(shù)據(jù)庫(kù)中 DML鎖主要包括TM鎖和TX鎖 其中TM鎖稱(chēng)為表級(jí)鎖 TX鎖稱(chēng)為事務(wù)鎖或行級(jí)鎖
當(dāng)Oracle執(zhí)行DML語(yǔ)句時(shí) 系統(tǒng)自動(dòng)在所要操作的表上申請(qǐng)TM類(lèi)型的鎖 當(dāng)TM鎖獲得后 系統(tǒng)再自動(dòng)申請(qǐng)TX類(lèi)型的鎖 并將實(shí)際鎖定的數(shù)據(jù)行的鎖標(biāo)志位進(jìn)行置位 這樣在事務(wù)加鎖前檢查T(mén)X鎖相容性時(shí)就不用再逐行檢查鎖標(biāo)志 而只需檢查T(mén)M鎖模式的相容性即可 大大提高了系統(tǒng)的效率
TM鎖包括了SS SX S X等多種模式 在Oracle數(shù)據(jù)庫(kù)中用 - 來(lái)表示 不同的SQL操作產(chǎn)生不同類(lèi)型的TM鎖 如表 所示
在數(shù)據(jù)行上只有X鎖(排他鎖) 在 Oracle數(shù)據(jù)庫(kù)中 當(dāng)一個(gè)事務(wù)首次發(fā)起一個(gè)DML語(yǔ)句時(shí)就獲得一個(gè)TX鎖 該鎖保持到事務(wù)被提交或回滾 當(dāng)兩個(gè)或多個(gè)會(huì)話在表的同一條記錄上執(zhí)行DML語(yǔ)句時(shí) 第一個(gè)會(huì)話在該條記錄上加鎖 其他的會(huì)話處于等待狀態(tài) 當(dāng)?shù)谝粋€(gè)會(huì)話提交后 TX鎖被釋放 其他會(huì)話才可以加鎖
當(dāng)Oracle數(shù)據(jù)庫(kù)發(fā)生TX鎖等待時(shí) 如果不及時(shí)處理常常會(huì)引起Oracle數(shù)據(jù)庫(kù)掛起 或?qū)е滤梨i的發(fā)生 產(chǎn)生ORA 的錯(cuò)誤 這些現(xiàn)象都會(huì)對(duì)實(shí)際應(yīng)用產(chǎn)生極大的危害 如長(zhǎng)時(shí)間未響應(yīng) 大量事務(wù)失敗等
TX鎖等待的分析
在介紹了有關(guān)地Oracle數(shù)據(jù)庫(kù)鎖的種類(lèi)后 下面討論如何有效地監(jiān)控和解決鎖等待現(xiàn)象 及在產(chǎn)生死鎖時(shí)如何定位死鎖的原因
監(jiān)控鎖的相關(guān)視圖 數(shù)據(jù)字典是Oracle數(shù)據(jù)庫(kù)的重要組成部分 用戶(hù)可以通過(guò)查詢(xún)數(shù)據(jù)字典視圖來(lái)獲得數(shù)據(jù)庫(kù)的信息 和鎖相關(guān)的數(shù)據(jù)字典視圖如表 所示
TX鎖等待的監(jiān)控和解決在日常工作中 如果發(fā)現(xiàn)在執(zhí)行某條SQL時(shí)數(shù)據(jù)庫(kù)長(zhǎng)時(shí)間沒(méi)有響應(yīng) 很可能是產(chǎn)生了TX鎖等待的現(xiàn)象 為解決這個(gè)問(wèn)題 首先應(yīng)該找出持鎖的事務(wù) 然后再進(jìn)行相關(guān)的處理 如提交事務(wù)或強(qiáng)行中斷事務(wù)
死鎖的監(jiān)控和解決在數(shù)據(jù)庫(kù)中 當(dāng)兩個(gè)或多個(gè)會(huì)話請(qǐng)求同一個(gè)資源時(shí)會(huì)產(chǎn)生死鎖的現(xiàn)象 死鎖的常見(jiàn)類(lèi)型是行級(jí)鎖死鎖和頁(yè)級(jí)鎖死鎖 Oracle數(shù)據(jù)庫(kù)中一般使用行級(jí)鎖 下面主要討論行級(jí)鎖的死鎖現(xiàn)象
當(dāng)Oracle檢測(cè)到死鎖產(chǎn)生時(shí) 中斷并回滾死鎖相關(guān)語(yǔ)句的執(zhí)行 報(bào)ORA 的錯(cuò)誤并記錄在Oracle數(shù)據(jù)庫(kù)的日志文件alertSID log中 同時(shí)在user_dump_dest下產(chǎn)生了一個(gè)跟蹤文件 詳細(xì)描述死鎖的相關(guān)信息
在日常工作中 如果發(fā)現(xiàn)在日志文件中記錄了ora 的錯(cuò)誤信息 則表明產(chǎn)生了死鎖 這時(shí)需要找到對(duì)應(yīng)的跟蹤文件 根據(jù)跟蹤文件的信息定位產(chǎn)生的原因
如果查詢(xún)結(jié)果表明 死鎖是由于bitmap索引引起的 將IND_T_PRODUCT_HIS_STATE索引改為normal索引后 即可解決死鎖的問(wèn)題
表 Oracle的TM鎖類(lèi)型
鎖模式 鎖描述 解釋 SQL操作
none
NULL 空 Select
SS(Row S) 行級(jí)共享鎖 其他對(duì)象只能查詢(xún)這些數(shù)據(jù)行 Select for update Lock for update Lock row share
SX(Row X) 行級(jí)排它鎖 在提交前不允許做DML操作 Insert Update Delete Lock row share
S(Share) 共享鎖 Create index Lock share
SSX(S/Row X) 共享行級(jí)排它鎖 Lock share row exclusive
lishixinzhi/Article/program/Oracle/201311/18509
首先我們還是來(lái)了解下什么是排他鎖,既然是排他,這種鎖肯定就是要不允許別人做一些事情的,排他鎖是表鎖定中限制性最強(qiáng)的一種,如果我們對(duì)某個(gè)表使用了排他鎖,那么這個(gè)表就只允許其他用戶(hù)查詢(xún)表中的行,而不允許插入、刪除或更新行。
也許有很多朋友會(huì)發(fā)現(xiàn),這種鎖不是和共享鎖很相似嗎?但是共同享鎖是允許多個(gè)用戶(hù)在同一個(gè)表中放置多個(gè)共享鎖的,而排他鎖只允許一個(gè)用戶(hù)在表中放置排他鎖,所以說(shuō),如果我在一個(gè)表中放置了排他鎖的話,別人就不能再在這個(gè)表中放置排他鎖的。在oracle中使用排他鎖的具體格式為:
lock table emp in exclusive mode;
,
這樣我們就對(duì)表emp放置了排他鎖了。
鎖是 數(shù)據(jù)庫(kù)保護(hù)數(shù)據(jù)表的一種機(jī)制,通常是自動(dòng)的,分級(jí)別的,如果你訪問(wèn)一個(gè)表的并發(fā)量太大,可以試試拆分這個(gè)表,比如按日期拆分成月表,或者利用oracle的功能(分區(qū))進(jìn)行拆分來(lái)分散壓力,如果沒(méi)有依據(jù)拆分的話,可以做成實(shí)體化快照,將一些查詢(xún)類(lèi)的操作指向這個(gè)快照,分?jǐn)偙淼脑L問(wèn)量,也可以通過(guò)提升硬件,比如上SSD磁盤(pán),然后將這個(gè)表放到這個(gè)磁盤(pán)上,提高訪問(wèn)速度。
lock table 表名 exclusive mode nowait; -- 鎖整個(gè)表
select * from 表名 where XXX for update nowaitl -- 鎖符合條件的記錄
如果當(dāng)前有用戶(hù)在對(duì)某行數(shù)據(jù)進(jìn)行修改登操作,oracle會(huì)在這行數(shù)據(jù)上添加行級(jí)鎖,期間,所有用戶(hù)對(duì)該行數(shù)據(jù)只能查詢(xún),不可修改,如果比如說(shuō)執(zhí)行update操作,需等待該修改操作事務(wù)提交或者回滾之后,才行。