濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Oracle數(shù)據(jù)完整性和鎖機(jī)制簡(jiǎn)析

Oracle數(shù)據(jù)完整性和鎖機(jī)制簡(jiǎn)析

熱門標(biāo)簽:地圖標(biāo)注付款了怎么找不到了 外呼系統(tǒng)鄭州 北京外呼系統(tǒng)公司排名 溫州人工外呼系統(tǒng) 貴陽(yáng)智能電銷機(jī)器人官網(wǎng) 沈陽(yáng)400電話是如何辦理 北京營(yíng)銷外呼系統(tǒng)廠家 百度地圖標(biāo)注員是干什么 外呼系統(tǒng)口號(hào)

本課內(nèi)容屬于Oracle高級(jí)課程范疇,內(nèi)容略微偏向理論性,但是與數(shù)據(jù)庫(kù)程序開發(fā)和管理、優(yōu)化密切相關(guān);另外本課的部分內(nèi)容在前面章節(jié)已經(jīng)涉及,請(qǐng)注意理論聯(lián)系實(shí)際。

事務(wù)

事務(wù)(Transaction)從 通訊的角度看:是用戶定義的數(shù)據(jù)庫(kù)操作序列,這些操作要么全做、要么全不做,是不可分割的一個(gè)工作單元。事務(wù)控制語(yǔ)句稱為TCL,一般包括Commit和Rollback。

事務(wù)不是程序,事務(wù)和程序分屬兩個(gè)概念。在RDBMS中,一個(gè)事務(wù)可以有一條SQL語(yǔ)句、一組SQL語(yǔ)句或者整個(gè)程序;一個(gè)應(yīng)用程序又通常包含多個(gè)事務(wù)。

事務(wù)是恢復(fù)和并發(fā)控制的基本單元。

顯式事務(wù)和隱式事務(wù)

begin

insert into classes_2(bjbh,bjmc,bjms,bzr,ssxb,bjrs,bz)

values ('888','測(cè)試班級(jí)','測(cè)試班級(jí)','肖豐斌','003','38','');

commit/rollback;

end ;

insert into classes_2(bjbh,bjmc,bjms,bzr,ssxb,bjrs,bz)

values ('888','測(cè)試班級(jí)','測(cè)試班級(jí)','肖豐斌','003','38','');

commit/rollback;

事務(wù)的ACID特性和結(jié)束方式

事務(wù)的ACID特性和結(jié)束方式

破壞事務(wù)ACID特性的因素包括:

1.多個(gè)事務(wù)并行運(yùn)行時(shí),不同事務(wù)的操作交叉執(zhí)行

2.事務(wù)在運(yùn)行過(guò)程中被強(qiáng)行終止

事務(wù)的結(jié)束方式包括:

并行性和一致性

并行性和一致性是針對(duì)多用戶、多事務(wù),而非單用戶、單事務(wù)數(shù)據(jù)庫(kù)環(huán)境的,其含義是在多用戶、多事務(wù)環(huán)境下,針對(duì)同一張數(shù)據(jù)庫(kù)表的數(shù)據(jù)存在同時(shí)更新(含Update和Insert、Delete)的情況。

并行性意味著多用戶能夠同時(shí)訪問數(shù)據(jù);

一致性意味著每個(gè)用戶看到的數(shù)據(jù)是一致的。

為保證數(shù)據(jù)的一致性,一般采用了事務(wù)隔離機(jī)制(事務(wù)隔離模型),又稱為事務(wù)串行化,用來(lái)保證事務(wù)盡量按照串行的方式執(zhí)行。

執(zhí)行并行事務(wù)要防止三種情況:

1.臟讀:事務(wù)讀取了另外一個(gè)沒有提交的事務(wù)的數(shù)據(jù)(臟數(shù)據(jù));

2.非重復(fù)讀:事務(wù)重新讀取了以前讀取的數(shù)據(jù),結(jié)果發(fā)現(xiàn)另外一個(gè)已經(jīng)提交的事務(wù)已經(jīng)修改了那些數(shù)據(jù);

3. 幻影讀:一個(gè)事務(wù)重新執(zhí)行,返回滿足條件的行集數(shù)據(jù),結(jié)果發(fā)現(xiàn)另外一個(gè)已經(jīng)提交的事務(wù)插入了滿足條件的其他行的數(shù)據(jù)。

隔離層未提交的讀模式提交的讀模式重復(fù)讀模式串行化模式臟讀可能不可能不可能不可能非重復(fù)讀可能可能不可能不可能幻影讀可能可能可能不可能

并行性適用的情況

前提條件是必須是多CPU的服務(wù)器上執(zhí)行,此時(shí)并行性的好處才能顯示出來(lái),單CPU服務(wù)器上實(shí)驗(yàn)并行性反而會(huì)降低性能。

•處理對(duì)大表(至少100萬(wàn)行記錄以上)的大數(shù)據(jù)量查詢

•處理連接非常大的表查詢

•處理建立大索引、大容量數(shù)據(jù)裝載、匯總計(jì)算

•處理Oracle對(duì)象間大量數(shù)據(jù)拷貝等作業(yè)

•處理在SMP(對(duì)稱多處理器)或MPP(大規(guī)模并行處理)群和聚合(多機(jī)器同時(shí)訪問同一組磁盤和主數(shù)據(jù)庫(kù))的機(jī)器上的查詢

•處理存放在分布于不同磁盤的多個(gè)數(shù)據(jù)文件中的數(shù)據(jù)查詢

•處理需要大量輔助內(nèi)存的查詢,如Group by、Order By等

語(yǔ)句級(jí)讀一致性和事務(wù)級(jí)讀一致性


Oracle鎖


什么是數(shù)據(jù)庫(kù)鎖

鎖是用于防止在訪問相同的資源(包括用戶對(duì)象、系統(tǒng)對(duì)象、內(nèi)存、Oralce數(shù)據(jù)字典中的共享數(shù)據(jù)結(jié)構(gòu),最常見的是數(shù)據(jù)庫(kù)表Table對(duì)象)時(shí) ,事務(wù)之間的有害性 交互(存、?。┑囊环N機(jī)制。

不同類型的鎖,代表了當(dāng)前用戶是允許還是阻止其它用戶對(duì)相同資源的同時(shí)存取,從而確保不破壞系統(tǒng)數(shù)據(jù)的完整性、一致性和并行性。

加鎖是實(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)行更新操作。

兩種鎖機(jī)制

共享鎖(Share Lock):即S鎖,是通過(guò)對(duì)數(shù)據(jù)存取的高并行性來(lái)實(shí)現(xiàn)的。加了共享鎖的數(shù)據(jù)庫(kù)對(duì)象可以被其它事務(wù)讀取,但是不能被其它事務(wù)修改。

獨(dú)占鎖(Exclusive Lock):即X鎖,又稱排它鎖,是用來(lái)防止同時(shí)共享相同資源的鎖。加了獨(dú)占鎖的數(shù)據(jù)庫(kù)對(duì)象不能被其它事務(wù)讀取和修改。

•鎖在事務(wù)保持期間是被保持的,用來(lái)防止包括臟讀、丟失更新和破壞性DLL等交互行為。對(duì)一個(gè)事務(wù)中SQL語(yǔ)句所做的修改只有在該事務(wù)提交或回滾后才能被其它事務(wù)所使用。

•Commit或Rollback執(zhí)行后,事務(wù)所使用的鎖被釋放。

死鎖

鎖的類型

1.數(shù)據(jù)鎖(DML鎖)。

用來(lái)保證并行訪問數(shù)據(jù)的完整性。能夠防止同步?jīng)_突的DML和DDL操作的破壞性 交互。是Oracle中主要的鎖,又包括表級(jí)鎖(TM鎖)和行級(jí)鎖(TX鎖、也稱為事務(wù)鎖)。

(1).TM鎖

1.數(shù)據(jù)鎖(DML鎖) 。

(2).TX鎖及DML鎖工作機(jī)制

TX鎖是Transaction eXclusive Lock行級(jí)排它鎖,對(duì)一條記錄加上TX鎖后,其他用戶不能修改、刪除該記錄。

•當(dāng)Oracle 執(zhí)行DML語(yǔ)句時(shí),系統(tǒng)自動(dòng)在所要操作的表上申請(qǐng)TM類型的鎖。當(dāng)TM鎖獲得后,系統(tǒng)再自動(dòng)申請(qǐng)TX類型的鎖,并將實(shí)際鎖定的數(shù)據(jù)行的鎖標(biāo)志位進(jìn)行置位。 這樣在事務(wù)加鎖前檢查TX鎖相容性時(shí)就不用再逐行檢查鎖標(biāo)志,而只需檢查TM鎖模式的相容性即可,大大提高了系統(tǒng)的效率。TM鎖包括了SS、SX、S、X 等多種模式,在數(shù)據(jù)庫(kù)中用0-6來(lái)表示。不同的SQL操作產(chǎn)生不同類型的TM鎖。

1.數(shù)據(jù)鎖(DML鎖)

(2).TX鎖及DML鎖工作機(jī)制

•在數(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-60的錯(cuò)誤。這些現(xiàn)象都會(huì)對(duì)實(shí)際應(yīng)用產(chǎn)生極大的危害,如長(zhǎng)時(shí)間未響應(yīng)、大量事務(wù)失敗等。

2.字典鎖(DDL鎖)

當(dāng) DDL命令發(fā)出時(shí),Oracle會(huì)自動(dòng)在被處理的對(duì)象上添加DDL鎖定,從而防止對(duì)象被其他用戶所修改。當(dāng)DDL命令結(jié)束以后,則釋放DDL鎖定。DDL鎖定不能顯式的被請(qǐng)求,只有當(dāng)對(duì)象結(jié)構(gòu)被修改或者被引用時(shí),才會(huì)在對(duì)象上添加DDL鎖定。比如創(chuàng)建或者編譯 存儲(chǔ)過(guò)程時(shí)會(huì)對(duì)引用的對(duì)象添加DDL鎖定。在創(chuàng)建視圖時(shí),也會(huì)對(duì)引用的表添加DDL鎖定等。

在執(zhí)行DDL命令之前,Oracle會(huì)自動(dòng)添加一個(gè)隱式提交命令,然后執(zhí)行具體的DDL命令,在DDL命令執(zhí)行結(jié)束之后,還會(huì)自動(dòng)添加一個(gè)隱式提交命令。實(shí)際上,Oracle在執(zhí)行DDL命令時(shí),都會(huì)將其轉(zhuǎn)換為對(duì)數(shù)據(jù)字典表的DML操作。比如我們發(fā)出創(chuàng)建表的DDL命令時(shí),Oracle會(huì)

2.字典鎖(DDL鎖)

將表的名稱插入數(shù)據(jù)字典表tab$里,同 時(shí)將表里的列名以及列的類型插入col$表里等。因此,在DDL命令中需要添加隱式的提交命令,從而提交那些對(duì)數(shù)據(jù)字典表的DML操作。即使DDL命令失 敗,它也會(huì)發(fā)出提交命令。DDL鎖包括三種類型:

•排他的DDL鎖定(Exclusive DDL Lock)
大部分的DDL操作都會(huì)在被操作的對(duì)象上添加排他的DDL鎖定,從而防止在DDL命令執(zhí)行期間,對(duì)象被其他用戶所修改。當(dāng)對(duì)象上添加了排他的DDL鎖定以后,該對(duì)象上不能再添加任何其他的DDL鎖定。如果是對(duì)表進(jìn)行DDL命令,則其他進(jìn)程也不能修改表里的數(shù)據(jù)。

2.字典鎖(DDL鎖)

•共享的DDL鎖定(Shared DDL Lock )
用來(lái)保護(hù)被DDL的對(duì)象不被其他用戶進(jìn)程所更新,但是允許其他進(jìn)程在對(duì)象上添加共享的DDL鎖定。如果是對(duì)表進(jìn)行DDL命令,則其他進(jìn)程可以同時(shí)修改表里 的數(shù)據(jù)。比如我們發(fā)出create view命令創(chuàng)建視圖時(shí),在視圖的所引用的表(這種表也叫基表)上添加的就是共享的DDL命令。也就是說(shuō),在創(chuàng)建視圖時(shí),其他用戶不能修改 基表的結(jié)構(gòu),但 是可以更新基表里的數(shù)據(jù)。

3.內(nèi)部鎖

內(nèi)部鎖保護(hù)內(nèi)部數(shù)據(jù)庫(kù)結(jié)構(gòu),如數(shù)據(jù)文件,對(duì)用戶是不可見的。

2.字典鎖(DDL鎖)

•可打破的解析鎖定(Breakable Parsed Lock)

在shared pool里緩存的SQL游標(biāo)或者PL/SQL程序代碼都會(huì)獲得引用對(duì)象上的解析鎖定。如果我們發(fā)出DDL命令修改了某個(gè)對(duì)象的結(jié)構(gòu)時(shí),該對(duì)象相關(guān)的、位于 shared pool里的解析鎖定就被打破,從而導(dǎo)致引用了該對(duì)象的SQL游標(biāo)或者PL/SQL程序代碼全都失效。下次再次執(zhí)行相同的SQL語(yǔ)句時(shí),需要重新解析,這 也就是所謂的SQL語(yǔ)句的reload了。可打破的解析鎖定不會(huì)阻止其他的DDL鎖定,如果發(fā)生與解析鎖定相沖突的DDL鎖定,則解析鎖定也會(huì)被打破

死鎖的解決

1.查找鎖

3.Kill 操作系統(tǒng)進(jìn)程

Orakill 實(shí)例名 操作系統(tǒng)進(jìn)程ID

Orakill oralearn 2444

其中oralearn是數(shù)據(jù)庫(kù)sid,244是第二步查出spid

數(shù)據(jù)完整性

常用的數(shù)據(jù)完整性約束規(guī)則包括:

1.NOT NULL

2.唯一關(guān)鍵字

3.主關(guān)鍵字

4.外鍵

5.檢查項(xiàng)Check

由于本部分內(nèi)容再前面的章節(jié)中已經(jīng)穿插講解,本處不再贅述

要點(diǎn)及習(xí)題

習(xí)題

1.什么是事務(wù),請(qǐng)解釋什么是顯式事務(wù)和隱式事務(wù)。

2.事務(wù)具有哪四個(gè)特性?并行性 事務(wù)主要使用的情況是什么,請(qǐng)舉出四種情況。

3.事務(wù)級(jí)讀一致性包括那三種類型,并列表說(shuō)明其相同點(diǎn)和不同點(diǎn)。

4.什么是數(shù)據(jù)庫(kù)鎖,包括那兩種大的類型?TM鎖又包括那些類型?

5.將表級(jí)鎖和行級(jí)鎖結(jié)合起來(lái),舉例解釋數(shù)據(jù)鎖的工作機(jī)制。

6.什么是死鎖?死鎖解決的步驟是什么?

7.為什么數(shù)據(jù)庫(kù)設(shè)計(jì)不推薦大量使用外鍵來(lái)確保數(shù)據(jù)完整性?

您可能感興趣的文章:
  • SQLServer主鍵和唯一約束的區(qū)別
  • SQLSERVER實(shí)現(xiàn)更改表名,更改列名,更改約束代碼
  • 如何獲取SqlServer2005表結(jié)構(gòu)(字段,主鍵,外鍵,遞增,描述)
  • 深入Mysql,SqlServer,Oracle主鍵自動(dòng)增長(zhǎng)的設(shè)置詳解
  • SQLSERVER聚集索引和主鍵(Primary Key)的誤區(qū)認(rèn)識(shí)
  • sqlserver主鍵設(shè)計(jì)的注意點(diǎn)
  • sqlserver數(shù)據(jù)庫(kù)主鍵的生成方式小結(jié)(sqlserver,mysql)
  • 小議sqlserver數(shù)據(jù)庫(kù)主鍵選取策略
  • sqlserver 因?yàn)檫x定的用戶擁有對(duì)象,所以無(wú)法除去該用戶的解決方法
  • SQLServer2005 批量查詢自定義對(duì)象腳本
  • SQLServer導(dǎo)出sql文件/表架構(gòu)和數(shù)據(jù)操作步驟
  • 詳解SQL Server數(shù)據(jù)庫(kù)架構(gòu)和對(duì)象、定義數(shù)據(jù)完整性

標(biāo)簽:衢州 淮北 衡水 潮州 溫州 通遼 定西 包頭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Oracle數(shù)據(jù)完整性和鎖機(jī)制簡(jiǎn)析》,本文關(guān)鍵詞  Oracle,數(shù)據(jù),完整性,和,鎖,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Oracle數(shù)據(jù)完整性和鎖機(jī)制簡(jiǎn)析》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Oracle數(shù)據(jù)完整性和鎖機(jī)制簡(jiǎn)析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    通许县| 法库县| 固阳县| 咸宁市| 怀宁县| 吐鲁番市| 太白县| 东阿县| 晋江市| 阿拉善左旗| 保定市| 达州市| 遂川县| 祁连县| 土默特左旗| 双城市| 西贡区| 连江县| 渭源县| 浏阳市| 双柏县| 铁岭市| 临潭县| 长白| 洞口县| 海门市| 五常市| 普陀区| 交口县| 南投县| 梁平县| 通山县| 林芝县| 新密市| 绥中县| 新龙县| 胶南市| 射洪县| 乐陵市| 辛集市| 吉安市|