• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      Oracle數(shù)據(jù)庫(kù)鎖的研究

      2021-08-09 03:23:48王志國(guó)周笑宇蘇仕斌
      電子技術(shù)與軟件工程 2021年11期
      關(guān)鍵詞:事務(wù)視圖一致性

      王志國(guó) 周笑宇* 蘇仕斌

      (1.中國(guó)人民解放軍聯(lián)勤保障部隊(duì)第九六三醫(yī)院 黑龍江省佳木斯市 154002)

      (2.中國(guó)人民解放軍總醫(yī)院醫(yī)學(xué)創(chuàng)新研究部 北京市 100853)

      數(shù)據(jù)庫(kù)是多個(gè)用戶使用的共享資源。 當(dāng)多個(gè)用戶同時(shí)訪問同一數(shù)據(jù)庫(kù)時(shí),多個(gè)事務(wù)將同時(shí)訪問數(shù)據(jù)庫(kù)中的相同數(shù)據(jù),此時(shí),多個(gè)用戶很有可能共同進(jìn)行對(duì)于該數(shù)據(jù)庫(kù)的查詢、修改等操作。如果對(duì)于并發(fā)操作不加以管理,則可能會(huì)讀寫錯(cuò)誤的數(shù)據(jù),并破壞數(shù)據(jù)庫(kù)四大特性中的一致性。 鎖是數(shù)據(jù)庫(kù)對(duì)并發(fā)訪問的、在指定權(quán)限下可以進(jìn)行共同訪問的管理的機(jī)制,它用于保護(hù)以合理的方式被修改的數(shù)據(jù)。 當(dāng)事務(wù)提交或者回滾后,對(duì)于該單位進(jìn)行釋放資源,此時(shí)其他用戶可以正常的更新數(shù)據(jù)。

      1 Oralce數(shù)據(jù)庫(kù)中關(guān)于鎖的定義

      Oracle 關(guān)于鎖的機(jī)制是輕量級(jí)的,它直接將鎖作為數(shù)據(jù)塊的屬性,存儲(chǔ)在數(shù)據(jù)塊的頭中,而不是建立用于數(shù)據(jù)鎖管理的鎖列表。鎖是數(shù)據(jù)塊本身的一個(gè)屬性,每個(gè)數(shù)據(jù)塊本身將數(shù)據(jù)的信息存儲(chǔ)在自己的數(shù)據(jù)塊中。這個(gè)地方叫做ITL。每當(dāng)此數(shù)據(jù)塊上有活動(dòng)事務(wù)時(shí),它的信息都會(huì)記錄在該數(shù)據(jù)塊中,以供后續(xù)操作查詢,確保事務(wù)的一致性。在oracle 數(shù)據(jù)庫(kù)中,沒有實(shí)際屬于對(duì)象或數(shù)據(jù)的鎖。鎖的信息是物理屬性的一部分,而不是邏輯屬性。

      2 數(shù)據(jù)庫(kù)鎖的分類

      2.1 按照操作分類

      2.1.1 DML 鎖DML 鎖(數(shù)據(jù)鎖),用于確保數(shù)據(jù)庫(kù)數(shù)據(jù)的完全度,其中包括行級(jí)鎖(TX 鎖)、表級(jí)鎖(TM 鎖)。

      2.1.2 DDL 鎖

      DDL鎖(數(shù)據(jù)字典鎖),用于保護(hù)數(shù)據(jù)庫(kù)創(chuàng)建的對(duì)象的完整組成,如視圖、索引、存儲(chǔ)過程等。其中包排他DDL 鎖(Exclusive DDL lock)、共享DDL 鎖(Share DDL lock)、可中斷解析鎖(Breakable parse locks)。

      2.2 按照鎖的粒度劃分

      2.2.1 行級(jí)鎖

      行級(jí)鎖指對(duì)正在被修改的行進(jìn)行鎖定,其他用戶可以其他沒有被鎖定的數(shù)據(jù)行。當(dāng)數(shù)據(jù)庫(kù)執(zhí)行刪除、更新等操作時(shí),會(huì)自動(dòng)將該事務(wù)在表中的操作行上獲得獨(dú)占鎖。當(dāng)事務(wù)啟動(dòng)第一次修改時(shí),它將獲得TX鎖(事務(wù)鎖),并將保持該鎖,直到事務(wù)被提交(COMMIT)或被回滾(ROLLBACK)。

      在使用以下語句時(shí),Oracle 會(huì)自動(dòng)應(yīng)用行級(jí)鎖:insert, update, delete, select…for update

      2.2.2 表級(jí)鎖

      表級(jí)鎖用于確保表的結(jié)構(gòu)在其他事務(wù)對(duì)于進(jìn)行該表操作時(shí)不會(huì)改變。當(dāng)用戶對(duì)表執(zhí)行 DDL 或 DML 操作時(shí),oracle 數(shù)據(jù)庫(kù)會(huì)自動(dòng)給該表加一個(gè)表級(jí)鎖。當(dāng)行級(jí)鎖被事務(wù)操作后,事務(wù)會(huì)自動(dòng)繼承該行級(jí)鎖上級(jí)的表級(jí)鎖(共享鎖), 以防止其他事務(wù)生成的DDL 語句,通過DDL 操作,來影響記錄行的更新。

      圖1:同時(shí)用兩個(gè)賬戶對(duì)同一條數(shù)據(jù)執(zhí)行更新

      圖2:查詢當(dāng)前的TX 鎖和TM 鎖

      圖3:查詢object_id

      圖4:scott 用戶進(jìn)行回滾操作

      圖5:scott 用戶回滾后查詢v$lock 視圖

      表級(jí)鎖按照鎖定的強(qiáng)度,可以分為以下的五個(gè)類型:

      (1)行共享:禁止其他的排他鎖對(duì)表進(jìn)行鎖定;

      (2)行排他:禁止使用除該排他鎖之外的其他共享鎖、排他鎖;

      圖6:system 用戶進(jìn)行回滾操作

      圖7:system 用戶回滾后查詢v$lock 視圖

      (3)共享鎖:對(duì)當(dāng)前操作的表進(jìn)行鎖定,僅允許非該用戶的其他用戶進(jìn)行查詢操作,并且禁止其他用戶插入、更新和刪除行;

      在出現(xiàn)以下條件之一時(shí),共享鎖就會(huì)被當(dāng)前所持有的事務(wù)進(jìn)行釋放:

      A、當(dāng)事務(wù)被ROLLBACK 或COMMIT。

      B、數(shù)據(jù)庫(kù)被完全退出。

      C、程序被強(qiáng)行關(guān)閉或停止。

      (4)共享排他鎖:禁止使用共享鎖,以及限制級(jí)別更高的的數(shù)據(jù)鎖;

      (5)排他鎖:數(shù)據(jù)庫(kù)中所有鎖中對(duì)于權(quán)限限制最高的鎖,僅允許非當(dāng)前用戶查詢?cè)摫淼男?。禁止修改和鎖定表。

      3 關(guān)于鎖的驗(yàn)證

      分別采用兩個(gè)不同的賬號(hào)登錄同一數(shù)據(jù)庫(kù),對(duì)oracle 數(shù)據(jù)庫(kù)中自帶的scott 用戶下的emp 表進(jìn)行更新操作,如圖1 所示。

      可以很明顯的看出,此時(shí)第二個(gè)賬戶并沒有進(jìn)行update 操作,這是因?yàn)閳?zhí)行update 命令時(shí),oracle 數(shù)據(jù)庫(kù)會(huì)自動(dòng)將該行數(shù)據(jù)添加行級(jí)鎖,使其他用戶無法更新該行數(shù)據(jù)。為了驗(yàn)證該說法,此時(shí)查詢v$lock 視圖,如圖2 所示。

      可以很明顯的看出,v$lock 視圖中,添加了關(guān)于該行語句的TX 鎖和TM 鎖,為了進(jìn)一步確認(rèn)上述鎖是由emp 表所產(chǎn)生的,我們通過查詢dba_objects 表來進(jìn)行進(jìn)一步的驗(yàn)證,如圖3 所示。

      明顯看到,該進(jìn)程ID 號(hào)是由于對(duì)于dba_object 表進(jìn)行加鎖所產(chǎn)生的,為了進(jìn)一步驗(yàn)證說法,此時(shí)對(duì)兩個(gè)事務(wù)均進(jìn)行回滾操作,如圖4 所示。

      3.1 scott用戶進(jìn)行回滾操作

      此時(shí)可以很明顯的看出,當(dāng)?shù)谝粋€(gè)用戶中的update 被回滾后,TX 鎖瞬間被解鎖,資源被釋放,才使得第二個(gè)用戶的update 得以成功執(zhí)行,此時(shí)查看一下v$lock 視圖,可以發(fā)現(xiàn),此時(shí)TX 鎖的ID 號(hào)已經(jīng)改變,且原來的ID 號(hào)已經(jīng)消失,如圖5 所示。

      3.2 system用戶進(jìn)行回滾操作

      如圖6 所示。

      此時(shí)查詢v$lock 視圖,可以很明顯的發(fā)現(xiàn),所有的TX 鎖和TM 鎖均已經(jīng)消失,如圖7 所示。

      4 死鎖

      4.1 死鎖的定義

      死鎖是指在兩個(gè)或多個(gè)進(jìn)程執(zhí)行過程中,由于資源競(jìng)爭(zhēng)或通信原因而導(dǎo)致的阻塞現(xiàn)象。如果沒有外力,只能互相等待分配資源,所有的進(jìn)程都無法繼續(xù)運(yùn)行。

      4.2 死鎖的產(chǎn)生原因

      在兩個(gè)或多個(gè)任務(wù)中,如果每個(gè)任務(wù)都互相對(duì)于其他已經(jīng)被試圖鎖定的任務(wù)進(jìn)行了加鎖的操作,此時(shí)這些任務(wù)會(huì)互相等待對(duì)方進(jìn)行資源分配,造成互相之間影響的阻塞現(xiàn)象,因此產(chǎn)生了死鎖。例如:事務(wù)A 對(duì)于行 1 的共享鎖進(jìn)行獲取。事務(wù) B 對(duì)于行 2 的共享鎖進(jìn)行獲取。此時(shí)事務(wù)A,因?yàn)榈却聞?wù)B 完成并釋放事務(wù)A 對(duì)于行2現(xiàn)有的共享鎖,從而產(chǎn)生了排他鎖,此時(shí)事務(wù)B,因?yàn)榈却聞?wù)A完成并釋放事務(wù)B 對(duì)于行2 現(xiàn)有的共享鎖,從而也產(chǎn)生了排他鎖。但是由于事務(wù)A 等待事務(wù)B 完成之后才能進(jìn)行釋放該行級(jí)鎖,事務(wù)B 也在等待事務(wù)A 完成之后才能釋放該行級(jí)鎖,兩個(gè)事務(wù)互相阻塞,產(chǎn)生了閉環(huán),所以造成了死鎖。這就是死鎖中的循環(huán)依賴:事務(wù) A 和事務(wù)B 之間相互依賴,從而產(chǎn)生了閉環(huán),導(dǎo)致了死鎖的產(chǎn)生。

      根據(jù)Oracle 數(shù)據(jù)庫(kù)的機(jī)制,該數(shù)據(jù)庫(kù)會(huì)自動(dòng)發(fā)現(xiàn)數(shù)據(jù)庫(kù)中產(chǎn)生的死鎖,并通過破壞死鎖條件之一進(jìn)行釋放部分資源,從而對(duì)某個(gè)事務(wù)的全部鎖進(jìn)行釋放,或直接消除代價(jià)最小的事務(wù),從而可以使其他單位的事務(wù)繼續(xù)運(yùn)行。

      4.3 避免死鎖的措施

      (1)在UPDATE 和DELETE 后,應(yīng)及時(shí)的進(jìn)行COMMIT 或ROLLBACK 操作,以免表或行的鎖定時(shí)間過長(zhǎng),造成死鎖。

      (2)當(dāng)多個(gè)事務(wù)同時(shí)對(duì)于某個(gè)數(shù)據(jù)表進(jìn)行操作時(shí),此時(shí)不要使用共享鎖。相反,請(qǐng)使用共享更新鎖,以便其他用戶可以使用行級(jí)鎖來提高并行性。

      (3)在高應(yīng)用程序負(fù)載期間不適合修改相關(guān)的數(shù)據(jù)結(jié)構(gòu)(表,視圖,觸發(fā)器,存儲(chǔ)過程等)。

      5 結(jié)語

      Oracle 數(shù)據(jù)庫(kù)之所以能成為全世界最廣泛使用的數(shù)據(jù)庫(kù)之一,原因之一就是因?yàn)樗鼘?duì)于事務(wù)的原子性、一致性、隔離性、持久性的保障,而鎖是oracle 數(shù)據(jù)庫(kù)為了確保數(shù)據(jù)的一致性、實(shí)現(xiàn)并發(fā)控制的非常重要的技術(shù)。在日常oracle 數(shù)據(jù)庫(kù)的維護(hù)和開發(fā)中,要深刻理解鎖的概念,并確保開發(fā)過程中不要出現(xiàn)死鎖,這樣才能確保數(shù)據(jù)更加健壯、穩(wěn)定。

      猜你喜歡
      事務(wù)視圖一致性
      “事物”與“事務(wù)”
      基于分布式事務(wù)的門架數(shù)據(jù)處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
      關(guān)注減污降碳協(xié)同的一致性和整體性
      公民與法治(2022年5期)2022-07-29 00:47:28
      注重教、學(xué)、評(píng)一致性 提高一輪復(fù)習(xí)效率
      IOl-master 700和Pentacam測(cè)量Kappa角一致性分析
      河湖事務(wù)
      5.3 視圖與投影
      視圖
      Y—20重型運(yùn)輸機(jī)多視圖
      SA2型76毫米車載高炮多視圖
      绿春县| 衡东县| 乌拉特中旗| 新密市| 宁武县| 莱西市| 民权县| 故城县| 高淳县| 宜丰县| 伽师县| 绵竹市| 凤山市| 铁岭市| 全椒县| 上饶市| 安新县| 平陆县| 涞水县| 天水市| 三河市| 塘沽区| 江北区| 平邑县| 沾化县| 安乡县| 遵义市| 阳朔县| 德保县| 三台县| 嵊泗县| 赤峰市| 临洮县| 松江区| 瓮安县| 江陵县| 曲阜市| 杨浦区| 成武县| 彭州市| 灵石县|