彭小斌,張文峰,林根深
南京軍區(qū)福州總院476臨床部信息科,福建 福州 350002
作為全球知名的關(guān)系型數(shù)據(jù)庫(kù)產(chǎn)品,ORACLE數(shù)據(jù)庫(kù)以其出色的數(shù)據(jù)庫(kù)管理能力、超強(qiáng)的穩(wěn)定性、良好的并發(fā)控制機(jī)制而聞名。ORACLE數(shù)據(jù)庫(kù)系統(tǒng)本身是一個(gè)多用戶并發(fā)處理系統(tǒng),任何一個(gè)時(shí)間節(jié)點(diǎn)內(nèi)都可能有許多用戶同時(shí)訪問和操作同一個(gè)數(shù)據(jù)庫(kù)對(duì)象。因此,并發(fā)訪問控制是數(shù)據(jù)庫(kù)最核心的管理機(jī)制之一,也是在數(shù)據(jù)庫(kù)運(yùn)行過程中容易出現(xiàn)錯(cuò)誤和故障的地方。本文對(duì)ORACLE數(shù)據(jù)庫(kù)并發(fā)訪問控制機(jī)制展開探討,并就實(shí)際工作中容易產(chǎn)生的并發(fā)性錯(cuò)誤提出相應(yīng)的解決方法。
ORACLE數(shù)據(jù)庫(kù)通過閂鎖(latch)和鎖定(lock)兩種機(jī)制來解決并發(fā)性訪問問題[1]。閂鎖是一個(gè)低級(jí)別、輕量級(jí)的鎖,獲得和釋放的速度很快,以類似信號(hào)燈的方式實(shí)現(xiàn)。鎖定可能持續(xù)的時(shí)間很長(zhǎng),通過使用隊(duì)列,按照先進(jìn)先出的方式實(shí)現(xiàn)??梢哉J(rèn)為閂鎖用于微觀領(lǐng)域,而鎖定用于宏觀領(lǐng)域。
ORACLE數(shù)據(jù)庫(kù)使用閂鎖來管理內(nèi)存、數(shù)據(jù)塊的分配和釋放。當(dāng)某個(gè)用戶進(jìn)程(假定為A)要對(duì)一個(gè)數(shù)據(jù)塊(block)進(jìn)行寫操作時(shí),將先獲得該數(shù)據(jù)塊的閂鎖,在其寫操作完成之前,該閂鎖將被此用戶進(jìn)程獨(dú)占,此時(shí)如果有其他進(jìn)程(假定為B)試圖對(duì)此數(shù)據(jù)塊進(jìn)行寫操作,會(huì)因無法獲得閂鎖而被迫進(jìn)入等待狀態(tài),當(dāng)A進(jìn)程結(jié)束操作時(shí)將釋放閂鎖,B進(jìn)程可以獲得閂鎖開始對(duì)數(shù)據(jù)塊進(jìn)行讀寫操作。閂鎖不僅用于數(shù)據(jù)塊讀寫管理,ORACLE中任何涉及到內(nèi)存地址的讀寫操作都要通過獲得閂鎖來實(shí)現(xiàn)串行化,一次只能有一個(gè)服務(wù)器進(jìn)程在讀或?qū)憙?nèi)存地址[2]。閂鎖分兩種類型:愿意等待(Willing-To-Wait)和不等待(No-Wait)。大部分閂鎖屬于第一種類型。當(dāng)進(jìn)程無法獲得閂鎖時(shí),會(huì)繞著CPU旋轉(zhuǎn)一段時(shí)間(以μs來計(jì)算)并再次嘗試獲得閂鎖,當(dāng)反復(fù)旋轉(zhuǎn)CPU并嘗試獲取閂鎖的次數(shù)超過某個(gè)上限(該上限由隱藏參數(shù)控制)時(shí),該進(jìn)程才會(huì)釋放CPU并進(jìn)入睡眠狀態(tài),同時(shí)產(chǎn)生一個(gè)對(duì)應(yīng)的等待事件并記錄在視圖V$session_wait里。No-Wait型閂鎖較少見。當(dāng)進(jìn)程請(qǐng)求此類閂鎖時(shí),若請(qǐng)求失敗,進(jìn)程將不會(huì)旋轉(zhuǎn)CPU而直接轉(zhuǎn)向另一個(gè)閂鎖的申請(qǐng)。
鎖定用來控制多用戶對(duì)數(shù)據(jù)庫(kù)表的相同數(shù)據(jù)的并發(fā)訪問。鎖定分TX鎖(TX鎖)和表級(jí)鎖(TM鎖)。當(dāng)用戶進(jìn)程找到被更新數(shù)據(jù)塊的相應(yīng)數(shù)據(jù)行時(shí),在其頭部設(shè)置一個(gè)行級(jí)鎖,并在頭部記錄當(dāng)前事務(wù)所使用的ITL槽的槽號(hào)。其他用戶進(jìn)程如果要更新此數(shù)據(jù)行的數(shù)據(jù),將發(fā)現(xiàn)該條記錄已經(jīng)被添加了行級(jí)鎖而進(jìn)入等待狀態(tài),直到前面的進(jìn)程完成更新操作并釋放TX鎖為止。由此可見,TX鎖是一種排他鎖(X鎖),即一旦用戶對(duì)某個(gè)資源添加了X鎖,則其他用戶都不能對(duì)該資源添加任何類型的鎖,直到該用戶釋放了資源上的X鎖為止。用戶對(duì)表數(shù)據(jù)進(jìn)行更新時(shí),不僅會(huì)在數(shù)據(jù)行的頭部記錄行級(jí)鎖,而且還會(huì)在表的級(jí)別上添加一個(gè)TM鎖。TM鎖共5種模式[3]:① 行級(jí)排他鎖(RX鎖):DML操作會(huì)自動(dòng)在被更新的表上添加RX鎖。該模式允許其他事務(wù)通過DML語(yǔ)句修改相同表里的其他數(shù)據(jù)行,但不允許其他事務(wù)對(duì)相同的表添加X鎖;② 行級(jí)共享鎖(RS鎖):通過select…from