国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

ORACLE數(shù)據(jù)庫(kù)并發(fā)訪問控制機(jī)制及訪問沖突的解決方法

2013-11-19 03:39:48彭小斌張文峰林根深
中國(guó)醫(yī)療設(shè)備 2013年1期
關(guān)鍵詞:會(huì)話字段事務(wù)

彭小斌,張文峰,林根深

南京軍區(qū)福州總院476臨床部信息科,福建 福州 350002

0 前言

作為全球知名的關(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)的解決方法。

1 閂鎖和鎖定機(jī)制

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)域。

1.1 閂鎖

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)。

1.2 鎖定

鎖定用來控制多用戶對(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

for update語(yǔ)句可以添加RS鎖,該鎖不允許其他事務(wù)對(duì)相同的表添加X鎖,但允許其他事務(wù)通過DML語(yǔ)句鎖定相同表里的其他數(shù)據(jù)行;③ 共享鎖(S鎖):通過lock table
in share mode命令添加該S鎖。該鎖不允許任何用戶更新表,但允許其他用戶對(duì)表添加RS鎖;④ X鎖:通過lock table
in exclusive mode命令添加該X鎖,該鎖不能對(duì)表進(jìn)行任何的DML和DDL操作,只能對(duì)該表進(jìn)行查詢;⑤共享行級(jí)排他鎖(SRX鎖):通過lock table
in share row exclusive mode命令添加SRX鎖,該鎖不能對(duì)相同的表進(jìn)行DML操作,也不能添加共享鎖。

2 鎖定的相關(guān)視圖

ORACLE數(shù)據(jù)庫(kù)借助以下幾個(gè)數(shù)據(jù)字典來管理鎖定問題[4]:

(1)V$transaction:該視圖記錄當(dāng)前每個(gè)活動(dòng)事務(wù)的信息。其中比較重要的字段包括XIDUSN(當(dāng)前事務(wù)使用的回滾段的編號(hào))、XIDSLOT(事務(wù)在回滾段頭部的事務(wù)表中對(duì)應(yīng)的記錄編號(hào))、XIDSQN(序列號(hào))。

(2)V$lock:該視圖記錄了當(dāng)前對(duì)話已經(jīng)獲得的鎖定以及正在請(qǐng)求的鎖定信息。其中比較重要的字段包括SID(session的ID號(hào))、TYPE(鎖定的類型和級(jí)別)、REQUEST(正在請(qǐng)求的鎖定模式)、BLOCK(是否阻止了其他用戶獲得鎖定)。

(3)V$locked_object:該視圖記錄當(dāng)前已經(jīng)被鎖定的對(duì)象信息,其中比較重要的字段包括XIDUSN(當(dāng)前事務(wù)使用的回滾段的編號(hào))、XIDSLOT(事務(wù)在回滾段頭部的事務(wù)表中對(duì)應(yīng)的記錄編號(hào))、XIDSQN(序列號(hào))、OBJECT_ID(當(dāng)前被鎖定對(duì)象的ID),LOCKED_MODE(鎖定模式的數(shù)字編碼))。

(4)V$session:記錄當(dāng)前session的相關(guān)信息。其中比較重要的字段包括SID(session編號(hào))、SERIAL#(序列號(hào)),SID和SERIAL#共同標(biāo)識(shí)一個(gè)session。

3 并發(fā)訪問沖突的現(xiàn)象、原因、檢測(cè)和解決方法

3.1 并發(fā)訪問沖突的現(xiàn)象

筆者所在的單位是一所部隊(duì)醫(yī)院,運(yùn)行的是“軍衛(wèi)一號(hào)”醫(yī)院信息系統(tǒng),該系統(tǒng)以O(shè)RACLE為數(shù)據(jù)庫(kù)管理系統(tǒng)(目前版本是10g),開發(fā)環(huán)境是PowerBuilder9.0,并發(fā)用戶數(shù)在400臺(tái)左右。在長(zhǎng)期的數(shù)據(jù)庫(kù)維護(hù)管理工作中,筆者經(jīng)常遇到并發(fā)訪問沖突的問題。表現(xiàn)為:某一臺(tái)或幾臺(tái)機(jī)的用戶在進(jìn)行程序操作特別是進(jìn)行數(shù)據(jù)保存時(shí)死機(jī)(鼠標(biāo)呈沙漏狀),此時(shí)系統(tǒng)不會(huì)有任何錯(cuò)誤提示,若用戶強(qiáng)行結(jié)束任務(wù)后重新進(jìn)行上述操作仍然失敗,最極端的情況是所有寫某個(gè)數(shù)據(jù)表的用戶都會(huì)死機(jī)。

3.2 原因

造成上述訪問沖突的原因一般有以下兩種[5]:

(1)應(yīng)用程序中的BUG。PowerBuilder經(jīng)常通過數(shù)據(jù)窗口技術(shù)(datawindow)來實(shí)現(xiàn)對(duì)數(shù)據(jù)的讀寫。當(dāng)數(shù)據(jù)窗口完成一次數(shù)據(jù)更新后,要通過resetupdate()函數(shù)來進(jìn)行數(shù)據(jù)窗口更新狀態(tài)的復(fù)位。否則數(shù)據(jù)窗口在進(jìn)行多次數(shù)據(jù)讀寫操作后很容易出現(xiàn)更新數(shù)據(jù)但不提交的現(xiàn)象(即對(duì)某數(shù)據(jù)表UPDATE后沒有COMMIT),當(dāng)其他用戶或程序也對(duì)該表的相同行數(shù)據(jù)進(jìn)行寫操作時(shí),就會(huì)把用戶鎖定。

(2)客戶端的電腦故障。當(dāng)客戶端對(duì)數(shù)據(jù)表進(jìn)行讀寫操作時(shí),如果此時(shí)客戶端電腦發(fā)生故障,如WINDOWS系統(tǒng)死機(jī)等,此時(shí)該用戶的COMMIT動(dòng)作沒有完成。其他用戶如果也在訪問該表的相同數(shù)據(jù)行,則很容易產(chǎn)生鎖定。

3.3 檢測(cè)和解決方法

筆者通過一個(gè)具體的例子來闡述并發(fā)訪問沖突的解決方法。假設(shè)A用戶在SQL_PLUS中執(zhí)行語(yǔ)句:update dept_dict set dept_name=’aaa’ where dept_code=’1001’;然后B用戶執(zhí)行語(yǔ)句:update dept_dict set dept_name=’bbb’ where dept_code=’1001’, 此 時(shí) B 用 戶 的SQL語(yǔ)句運(yùn)行將出現(xiàn)死機(jī)。當(dāng)執(zhí)行select * from v$locked_object語(yǔ)句,查出當(dāng)前被鎖住會(huì)話的session_ID是9和11。再執(zhí)行語(yǔ)句 select sid、type、ID1、ID2、lmode、request、block from v$lock where sid in(9,11),查詢結(jié)果,見表1。

表1 解決并發(fā)訪問沖突實(shí)例的查詢結(jié)果

從表1可知,A用戶的SQL語(yǔ)句(即SID=9的會(huì)話)已經(jīng)在DEPT_DICT表中添加了TX鎖和TM鎖,當(dāng)B用戶執(zhí)行自己的SQL語(yǔ)句(即SID=11的會(huì)話)時(shí)也往該表的同一條記錄添加TX鎖和TM鎖。TM鎖添加成功,添加TX鎖時(shí)由于該行記錄已被A用戶的會(huì)話鎖住且尚未釋放,所以添加失敗,因此第4行記錄的Lmode字段值為0,表示TX鎖未添加成功,同時(shí)第1行記錄的Block字段值為1,表示sid=9的會(huì)話的TX鎖阻止了其他用戶獲得此鎖。查明是由于sid=9的會(huì)話阻塞了sid=11的會(huì)話獲得鎖定后,我們就可以進(jìn)行解鎖操作了。通常的解鎖操作有兩種:一種是將前面會(huì)話的SQL操作正常提交,即運(yùn)行COMMIT語(yǔ)句,當(dāng)A用戶的SQL操作完成后自動(dòng)會(huì)將TX鎖和TX排他鎖釋放,B用戶即可獲得該條記錄的TX鎖并完成自己的SQL操作。第二種方法是將前面會(huì)話刪掉,此方法用于前面會(huì)話已經(jīng)無法正常提交的情況。以本例而言,可執(zhí)行語(yǔ)句:select sid,serail#from v$session where sid=9,查出sid=9的會(huì)話serial#=189;然后運(yùn)行語(yǔ)句:alter system kill session(9,189),將A用戶的會(huì)話強(qiáng)行刪除,該會(huì)話自動(dòng)釋放TX鎖和TM鎖,這樣B用戶即可獲取相應(yīng)鎖并完成自己的SQL操作。

4 結(jié)束語(yǔ)

綜上所述,ORACLE數(shù)據(jù)庫(kù)主要是通過閂鎖和鎖定機(jī)制來實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)并發(fā)訪問的控制,前者基于內(nèi)存和數(shù)據(jù)塊層面,屬微觀范疇;后者基于數(shù)據(jù)表和記錄,屬宏觀領(lǐng)域。同時(shí)ORACLE提供了若干數(shù)據(jù)字典和視圖,方便數(shù)據(jù)庫(kù)管理員(DBA)實(shí)時(shí)了解數(shù)據(jù)庫(kù)當(dāng)前的用戶連接和鎖定狀況,共同為ORACLE用戶提供強(qiáng)大的并發(fā)控制機(jī)制和高效的并發(fā)管理能力。

[1]余鋼,朱莉,張?jiān)祁?ORACLE DML封鎖等待原因分析和應(yīng)用中的處理方法[J].電腦知識(shí)與技術(shù),2005,(10):42-43.

[2]薩師煊,王珊.數(shù)據(jù)庫(kù)系統(tǒng)概論[M].3版.北京:高等教育出版社,2000.

[3]沈金發(fā),鄭甫京,王令赤,等.ORACLE關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)[M].北京:清華大學(xué)出版社,1992.

[4]韓思捷.ORACLE數(shù)據(jù)庫(kù)技術(shù)實(shí)用詳解[M].北京:電子工業(yè)出版社,2008.

[5]滕永昌.ORACLE9I數(shù)據(jù)庫(kù)管理員使用大全[M].北京:清華大學(xué)出版社,2004.

[6]周芃,顧鳳軍,周昕.ORACLE閃回技術(shù)的使用與分析[J].中國(guó)醫(yī)療設(shè)備,2009,24(2):51-53.

[7]劉志敏,劉微.Oracle數(shù)據(jù)庫(kù)日志挖掘工具的利用[J].中國(guó)醫(yī)療設(shè)備,2008,23(1):29-30.

猜你喜歡
會(huì)話字段事務(wù)
“事物”與“事務(wù)”
基于分布式事務(wù)的門架數(shù)據(jù)處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
圖書館中文圖書編目外包數(shù)據(jù)質(zhì)量控制分析
河湖事務(wù)
有意冒犯性言語(yǔ)的會(huì)話含義分析
漢語(yǔ)教材中的會(huì)話結(jié)構(gòu)特征及其語(yǔ)用功能呈現(xiàn)——基于85個(gè)會(huì)話片段的個(gè)案研究
CNMARC304字段和314字段責(zé)任附注方式解析
無正題名文獻(xiàn)著錄方法評(píng)述
關(guān)于CNMARC的3--字段改革的必要性與可行性研究
沖突語(yǔ)的會(huì)話分析研究
商河县| 孟连| 莒南县| 弥渡县| 望城县| 江都市| 双柏县| 池州市| 玉屏| 虞城县| 湘西| 益阳市| 高青县| 林州市| 石泉县| 长汀县| 桃江县| 封开县| 乡城县| 札达县| 上虞市| 萍乡市| 潍坊市| 常州市| 伽师县| 饶河县| 河北区| 灵丘县| 焉耆| 水城县| 错那县| 潼南县| 宁海县| 兴仁县| 同江市| 大荔县| 南京市| 保康县| 微山县| 上思县| 博白县|
<samp id="cc2oq"><tbody id="cc2oq"></tbody></samp>
<th id="cc2oq"><menu id="cc2oq"></menu></th>