版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第7章數(shù)據(jù)庫的安全保護(hù)本章要點
DBMS對數(shù)據(jù)庫的安全保護(hù)功能是通過四方面來實現(xiàn)的,即安全性控制、完整性控制、并發(fā)性控制和數(shù)據(jù)庫恢復(fù)。本章就將從這四方面來介紹數(shù)據(jù)庫的安全保護(hù)功能,重點要求讀者掌握它們的含義及實現(xiàn)這些安全保護(hù)功能的方法,可結(jié)合SQLServer加深四部分內(nèi)容的理解與操作技能。本章邏輯結(jié)構(gòu)7.1數(shù)據(jù)庫的安全性
7.1.1.數(shù)據(jù)庫安全性概述
7.1.2.
安全性控制的一般方法
7.1.3.
安全性控制的其它方法
7.1.4.
SQLServer安全性概述
7.2完整性控制
7.2.1.數(shù)據(jù)庫完整性概述
7.2.2.完整性規(guī)則的組成
7.2.3.完整性約束條件的分類
7.2.4.SQLServer完整性概述7.3并發(fā)控制與封鎖本章邏輯結(jié)構(gòu)
7.3.1.數(shù)據(jù)庫并發(fā)性概述
7.3.2.事務(wù)的基本概念
7.3.3.并發(fā)操作與數(shù)據(jù)的不一致性
7.3.4.封鎖及其產(chǎn)生問題的解決
7.3.5.SQLServer的并發(fā)控制機(jī)制7.4數(shù)據(jù)庫的恢復(fù)
7.4.1.數(shù)據(jù)庫恢復(fù)概述
7.4.2.數(shù)據(jù)庫恢復(fù)的基本原理及其實現(xiàn)技術(shù)
7.4.3.數(shù)據(jù)庫的故障及其恢復(fù)策略
7.4.4.SQLServer的備份和還原機(jī)制
作業(yè)前言:數(shù)據(jù)庫安全的概念數(shù)據(jù)庫簡介信息與數(shù)據(jù)數(shù)據(jù)庫系統(tǒng)一般由4個部分組成:(1)數(shù)據(jù)庫,即存儲在磁帶、磁盤、光盤或其他外存介質(zhì)上、按一定結(jié)構(gòu)組織在一起的相關(guān)數(shù)據(jù)的集合。(2)數(shù)據(jù)庫管理系統(tǒng)(DBMS)。它是一組能完成描述、管理、維護(hù)數(shù)據(jù)庫的程序系統(tǒng)。它按照一種公用的和可控制的方法完成插入新數(shù)據(jù)、修改和檢索原有數(shù)據(jù)的操作。(3)數(shù)據(jù)庫管理員(DBA)。(4)用戶和應(yīng)用程序。4數(shù)據(jù)庫的構(gòu)成記錄;屬性二維表數(shù)據(jù)模型層次網(wǎng)狀關(guān)系數(shù)據(jù)庫操縱56問題的提出數(shù)據(jù)庫的一大特點是數(shù)據(jù)可以共享數(shù)據(jù)共享必然帶來數(shù)據(jù)庫的安全性問題數(shù)據(jù)庫系統(tǒng)中的數(shù)據(jù)共享不能是無條件的共享例:軍事秘密、國家機(jī)密、新產(chǎn)品實驗數(shù)據(jù)、市場需求分析、市場營銷策略、銷售計劃、客戶檔案、醫(yī)療檔案、銀行儲蓄數(shù)據(jù)數(shù)據(jù)庫安全性數(shù)據(jù)庫的安全性是指保護(hù)數(shù)據(jù)庫,以防止非法使用所造成數(shù)據(jù)的泄露、更改或破壞。安全性問題有許多方面,其中包括:(1)法律、社會和倫理方面,例如請求查詢信息的人是不有合法的權(quán)力。(2)物理控制方面,例如計算機(jī)機(jī)房或終端是否應(yīng)該加鎖或用其他方法加以保護(hù)。(3)政策方面,確定存取原則,允許哪些用戶存取哪些數(shù)據(jù)。(4)運行方面,使用口令時,如何使口令保持秘密。(5)硬件控制方面,CPU是否提供任何安全性方面的功能,諸如存儲保護(hù)鍵或特權(quán)工作方式。(6)操作系統(tǒng)安全性方面,在主存儲器和數(shù)據(jù)文件用過以后,操作系統(tǒng)是否把它們的內(nèi)容清除掉。(7)數(shù)據(jù)庫系統(tǒng)本身安全性方面。這里討論的是數(shù)據(jù)庫本身的安全性問題,即探討數(shù)據(jù)庫自身安全保護(hù)的策略與技術(shù)。
例如,甲用戶可以訪問表T1,但無權(quán)訪問表T2,如果乙用戶把表T2的所有記錄添加到表T1中之后,則由于乙用戶的操作,使甲用戶獲得了對表T2中記錄的訪問。 此外,用戶可以多次利用允許的訪問結(jié)果,經(jīng)過邏輯推理得到他無權(quán)訪問的數(shù)據(jù)。7.1數(shù)據(jù)庫安全性7.1.1.數(shù)據(jù)庫安全性概述7.1.2.
安全性控制的一般方法7.1.3.
安全性控制的其它方法7.1.4.
SQLServer安全性概述返回本章首頁7.1.1數(shù)據(jù)庫安全性概述
數(shù)據(jù)庫的安全性是指保護(hù)數(shù)據(jù)庫,以防止非法使用所造成數(shù)據(jù)的泄露、更改或破壞。安全性問題有許多方面,其中包括:(1)法律、社會和倫理方面,例如請求查詢信息的人是不有合法的權(quán)力;(2)物理控制方面,例如計算機(jī)機(jī)房或終端是否應(yīng)該加鎖或用其他方法加以保護(hù);(3)政策方面,確定存取原則,允許哪些用戶存取哪些數(shù)據(jù);(4)運行與技術(shù)方面,使用口令時,如何使口令保持秘密;BACK5.1.1數(shù)據(jù)庫安全性概述(5)硬件控制方面,CPU是否提供任何安全性方面的功能,諸如存儲保護(hù)鍵或特權(quán)工作方式;(6)操作系統(tǒng)安全性方面,在主存儲器和數(shù)據(jù)文件用過以后,操作系統(tǒng)是否把它們的內(nèi)容清除掉;(7)數(shù)據(jù)庫系統(tǒng)本身安全性方面。BACK7.1.2安全性控制的一般方法
安全性控制是指要盡可能地杜絕所有可能的數(shù)據(jù)庫非法訪問。用戶非法使用數(shù)據(jù)庫可以有很多種情況。例如,編寫合法的程序繞過DBMS授權(quán)機(jī)制,通過操作系統(tǒng)直接存取、修改或備份有關(guān)數(shù)據(jù)。用戶訪問非法數(shù)據(jù),無論它們是有意的還是無意的,都應(yīng)該加以嚴(yán)格控制,因此,系統(tǒng)還要考慮數(shù)據(jù)信息的流動問題并加以控制,否則有潛在的危險性。因為數(shù)據(jù)的流動可能使無權(quán)訪問的用戶獲得訪問權(quán)利。為防止這一點,訪問的許可權(quán)還要結(jié)合過去訪問的情況而定??梢姲踩缘膶嵤┦且ㄙM一定代價,并需縝密考慮的。安全保護(hù)策略就是要以最小的代價來最大程度防止對數(shù)據(jù)的非法訪問,通常需要層層設(shè)置安全措施。實際上,數(shù)據(jù)庫系統(tǒng)的安全性問題,類似于整個計算機(jī)系統(tǒng)一級級層層設(shè)置安全的情況,其安全控制模型一般如圖5.1所示。7.1.2安全性控制的一般方法BACK7.1.2安全性控制的一般方法
根據(jù)圖的安全模型,當(dāng)用戶進(jìn)入計算機(jī)系統(tǒng)時,系統(tǒng)首先根據(jù)輸入的用戶標(biāo)識進(jìn)行身份的鑒定,只有合法的用戶才準(zhǔn)許進(jìn)入系統(tǒng)。對已進(jìn)入系統(tǒng)的用戶,DBMS還要進(jìn)行存取控制,只允許用戶進(jìn)行合法的操作BACKDBMS是建立在操作系統(tǒng)之上的,安全的操作系統(tǒng)是數(shù)據(jù)庫安全的前提。操作系統(tǒng)應(yīng)能保證數(shù)據(jù)庫中的數(shù)據(jù)必須由DBMS訪問,而不允許用戶越過DBMS,直接通過操作系統(tǒng)或其它方式訪問。數(shù)據(jù)最后可以通過密碼的形式存儲到數(shù)據(jù)庫中。能做到非法者即使得到了加密數(shù)據(jù),也無法識別它的安全效果。下面,本書就同數(shù)據(jù)庫有關(guān)的用戶標(biāo)識和鑒定、存取控制、定義視圖、數(shù)據(jù)加密和審計等幾類安全性措施作一討論。7.1.2安全性控制的一般方法BACK1、用戶標(biāo)識和鑒別用戶標(biāo)識和鑒定是系統(tǒng)提供的最外層的安全保護(hù)措施,其方法是由系統(tǒng)提供一定的方式讓用戶標(biāo)識自己的名字或身份,系統(tǒng)內(nèi)部記錄著所有合法用戶的標(biāo)識,每次用戶要求進(jìn)入系統(tǒng)時,由系統(tǒng)進(jìn)行核實,通過鑒定后才提供機(jī)器的使用權(quán)。用戶標(biāo)識和鑒定的方法有:(1)單用戶名鑒別法:用一個用戶名或用戶標(biāo)識符來標(biāo)明用戶的身份,系統(tǒng)以此來鑒別用戶的合法性.7.1.2安全性控制的一般方法BACK7.1.2安全性控制的一般方法(2)用戶名與口令聯(lián)合鑒別法:用戶標(biāo)識符是用戶公開的標(biāo)識,它不足以成為鑒別用戶身份的憑證。(3)透明公式鑒別法:每個用戶都預(yù)先約定好一個過程或者函數(shù),鑒別用戶身份時,系統(tǒng)提供一個隨機(jī)數(shù),用戶根據(jù)自己預(yù)先約定的計算過程或者函數(shù)進(jìn)行計算,系統(tǒng)根據(jù)計算結(jié)果辨別用戶身份的合法性。BACK7.1.2安全性控制的一般方法2、用戶存取權(quán)限控制用戶存取權(quán)限指的是不同的用戶對于不同的數(shù)據(jù)對象允許執(zhí)行的操作權(quán)限。存取權(quán)限由兩個要素組成,數(shù)據(jù)對象和操作類型。定義一個用戶的存取權(quán)限就是要定義這個用戶可以在哪些數(shù)據(jù)對象上進(jìn)行哪些類型的操作。在數(shù)據(jù)庫系統(tǒng)中,定義用戶存取權(quán)限稱為授權(quán)。授權(quán)有兩種:(1)系統(tǒng)權(quán)限:由DBA授予某些數(shù)據(jù)庫用戶,只有得到系統(tǒng)權(quán)限,才能成為數(shù)據(jù)庫用戶。BACK7.1.2安全性控制的一般方法(2)對象權(quán)限:可以由DBA授予,也可以由數(shù)據(jù)對象的創(chuàng)建者授予,使數(shù)據(jù)庫用戶具有對某些數(shù)據(jù)對象進(jìn)行某些操作的權(quán)限.這些授權(quán)定義經(jīng)過編譯后以一張授權(quán)表的形式存放在數(shù)據(jù)字典中。授權(quán)表主要有三個屬性,用戶標(biāo)識、數(shù)據(jù)對象和操作類型。BACK7.1.2安全性控制的一般方法3、視圖機(jī)制為不同的用戶定義不同的視圖,可以限制各個用戶的訪問范圍。通過視圖機(jī)制把要保密的數(shù)據(jù)對無權(quán)存取這些數(shù)據(jù)的用戶隱藏起來,從而自動地對數(shù)據(jù)提供一定程度的安全保護(hù)。4、數(shù)據(jù)加密數(shù)據(jù)加密是防止數(shù)據(jù)庫中數(shù)據(jù)在存儲和傳輸中失密的有效手段.加密的基本思想是根據(jù)一定的算法將原始數(shù)據(jù)加密成為不可直接識別的格式,數(shù)據(jù)以密碼的形式存儲和傳輸.BACK7.1.2安全性控制的一般方法加密方法有兩種:(1)替換方法:該方法使用密鑰將明文中的每一個字符轉(zhuǎn)換為密文中的一個字符.(2)轉(zhuǎn)換方法:該方法將明文中的字符按不同的順序重新排列.用密碼存儲數(shù)據(jù),在存入時需加密,在查詢時需解密,這個過程會占用較多的系統(tǒng)資源,降低了數(shù)據(jù)庫的性能。5、審計實際上任何系統(tǒng)的安全性措施都不是絕對可靠的,竊密者總有辦法打破這些控制。審計功能是一種監(jiān)視措施,跟蹤記錄有關(guān)數(shù)據(jù)的訪問活動。BACK7.1.3安全性控制的其它方法
1、強(qiáng)制存取控制(MAC)有些數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)要求很高的保密性,通常具有靜態(tài)的嚴(yán)格的分層結(jié)構(gòu),強(qiáng)制存取控制能實現(xiàn)這種高保密性要求.這種方法的基本思想在于每個數(shù)據(jù)對象(文件、記錄記錄或宇段等)賦予一定的密級,級別從高到低有:絕密級、機(jī)密級、秘密級和公用級.每個用戶也具有相應(yīng)的級別,稱為許可證級別.在系統(tǒng)運行時,采用如下兩條簡單規(guī)則:(1)用戶U只能查看比它級別低或同級的數(shù)據(jù)。(2)用戶U只能修改和它同級的數(shù)據(jù).強(qiáng)制存取控制是一種獨立于值的控制方法.它的優(yōu)點是系統(tǒng)能執(zhí)行“信息流控制”。BACK5.1.3安全性控制的其它方法
1、強(qiáng)制存取控制(MAC)
在第②條,用戶U顯然不能修改比它級別高的數(shù)據(jù),也不能修改比它級別低的數(shù)據(jù),這樣主要是為了防止具有較高級別的用戶將該級別的數(shù)據(jù)復(fù)制到較低級別的文件中。強(qiáng)制存取控制是一種獨立于值的控制方法。它的優(yōu)點是系統(tǒng)能執(zhí)行“信息流控制”。在前面介紹的授權(quán)方法中,允許凡有權(quán)查看保密數(shù)據(jù)的用戶就可以把這種數(shù)據(jù)拷貝到非保密的文件中,造成無權(quán)用戶也可接觸保密數(shù)據(jù)。而強(qiáng)制存取控制可以避免這種非法的信息流動。注意:這種方法在通用數(shù)據(jù)庫系統(tǒng)中應(yīng)用不廣泛,只是在某些專用系統(tǒng)中才有用。BACK7.1.3安全性控制的其它方法
2、統(tǒng)計數(shù)據(jù)庫的安全性查詢僅僅是某些記錄的統(tǒng)計值,例如求記錄數(shù)、和、平均值等。在統(tǒng)計數(shù)據(jù)庫中,雖然不允許用戶查詢單個記錄的信息,但是用戶可以通過處理足夠多的匯總信息來分析出單個記錄的信息.在統(tǒng)計數(shù)據(jù)庫中,對查詢應(yīng)作下列限制:①一個查詢查到的記錄個數(shù)至少是n;②兩個查詢查到的記錄的“交”數(shù)目至多是m.
BACK7.1.3安全性控制的其它方法
2、統(tǒng)計數(shù)據(jù)庫的安全性
系統(tǒng)可以調(diào)整n和m的值,使得用戶很難在統(tǒng)計數(shù)據(jù)庫中獲取其他個別記錄的信息,但要做到完全杜絕是不可能的。我們應(yīng)限制用戶計算和、個數(shù)、平均值的能力。如果一個破壞者只知道他自己的數(shù)據(jù),那么已經(jīng)證明,他至少要花1+(n-2)/m次查詢才有可能獲取其他個別記錄的信息。因而,系統(tǒng)應(yīng)限制用戶查詢的次數(shù)在1+(n-2)/m次以內(nèi)。但是這個方法還不能防止兩個破壞者聯(lián)手查詢導(dǎo)致數(shù)據(jù)的泄露。
BACK7.1.3安全性控制的其它方法
2、統(tǒng)計數(shù)據(jù)庫的安全性
保證數(shù)據(jù)庫安全性的另一個方法是“數(shù)據(jù)污染”,也就是在回答查詢時,提供一些偏離正確值的數(shù)據(jù),以免數(shù)據(jù)泄露。當(dāng)然,這個偏離要在不破壞統(tǒng)計數(shù)據(jù)的前提下進(jìn)行。此時,系統(tǒng)應(yīng)該在準(zhǔn)確性和安全性之間作出權(quán)衡。當(dāng)安全性遭到威脅時,只能降低準(zhǔn)確性的標(biāo)準(zhǔn)。BACK7.1.4SQLServer安全性概述SQLServer安全系統(tǒng)的構(gòu)架建立在用戶和用戶組的基礎(chǔ)上.SQLServer提供了3種安全管理模式,即標(biāo)準(zhǔn)模式、集成模式和混合模式,數(shù)據(jù)庫設(shè)計者和數(shù)據(jù)庫管理員可以根據(jù)實際情況進(jìn)行選擇。1、兩個安全性階段:身份驗證和授權(quán)。2、用戶權(quán)限:登錄創(chuàng)建在Windows中,而非SQLServer中。BACK7.1.4SQL
Server安全性概述當(dāng)用戶連接到SQLServer實例后,他們可以執(zhí)行的活動由授予以下帳戶的權(quán)限確定:(1)用戶的安全帳戶;(2)用戶的安全帳戶所屬Windows組或角色層次結(jié);(3)用戶若要進(jìn)行任何涉及更改數(shù)據(jù)庫定義或訪問數(shù)據(jù)的活動,則必須有相應(yīng)的權(quán)限。BACK7.1.4
SQLServer安全性概述
3、視圖安全機(jī)制SQLServer通過限制可由用戶使用的數(shù)據(jù),可以將視圖作為安全機(jī)制。用戶可以訪問某些數(shù)據(jù),進(jìn)行查詢和修改,但是表或數(shù)據(jù)庫的其余部分是不可見的,也不能進(jìn)行訪問。4、加密方法SQLServer支持加密或可以加密的內(nèi)容為:①SQLServer中存儲的登錄和應(yīng)用程序角色密碼;②作為網(wǎng)絡(luò)數(shù)據(jù)包而在客戶端和服務(wù)器端之間發(fā)送的數(shù)據(jù);③SQLServer中如下對象的定義內(nèi)容:存儲過程、用戶定義函數(shù)、視圖、觸發(fā)器、默認(rèn)值、規(guī)則等。BACK7.1.4SQLServer安全性概述5、審核活動SQLServer提供審核功能,用以跟蹤和記錄每個SQLServer實例上已發(fā)生的活動(如成功和失敗的記錄)。SQLServer還提供管理審核記錄的接口,即SQL事件探查器。只有sysadmin固定安全角色的成員才能啟用或修改審核,而且審核的每次修改都是可審核的事件。BACK7.2數(shù)據(jù)庫完整性
5.2.1數(shù)據(jù)庫完整性概述5.2.2完整性規(guī)則的組成5.2.3完整性約束條件的分類5.2.4SQLServer完整性概述7.2.1數(shù)據(jù)庫完整性概述
數(shù)據(jù)庫的完整性是指保護(hù)數(shù)據(jù)庫中數(shù)據(jù)的正確性、有效性和相容性,防止錯誤的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫造成無效操作。顯然,維護(hù)數(shù)據(jù)庫的完整性非常重要,數(shù)據(jù)庫中的數(shù)據(jù)是否具備完整性關(guān)系到數(shù)據(jù)能否真實地反映現(xiàn)實世界。數(shù)據(jù)庫的完整性和安全性是數(shù)據(jù)庫保護(hù)的兩個不同的方面。安全性是保護(hù)數(shù)據(jù)庫,以防止非法使用所造成數(shù)據(jù)的泄露、更改或破壞,安全性措施的防范對象是非法用戶和非法操作;完整性是防止合法用戶使用數(shù)據(jù)庫時向數(shù)據(jù)庫中加入不符合語義的數(shù)據(jù),完整性措施的防范對象是不合語義的數(shù)據(jù)。BACK7.2.2完整性規(guī)則的組成
完整性規(guī)則主要由以下三部分構(gòu)成:(1)觸發(fā)條件:規(guī)定系統(tǒng)什么時候使用規(guī)則檢查數(shù)據(jù);(2)約束條件:規(guī)定系統(tǒng)檢查用戶發(fā)出的操作請求違背了什么樣的完整性約束條件;(3)違約響應(yīng):規(guī)定系統(tǒng)如果發(fā)現(xiàn)用戶的操作請求違背了完整性約束條件,應(yīng)該采取一定的動作來保證數(shù)據(jù)的完整性,即違約時要做的事情。完整性規(guī)則從執(zhí)行時間上可分為立即執(zhí)行約束(ImmediateConstraints)和延遲執(zhí)行約束(DeferredConstraints)。立即執(zhí)行約束是指在執(zhí)行用戶事務(wù)過程中,某一條語句執(zhí)行完成后,系統(tǒng)立即對此數(shù)據(jù)進(jìn)行完整性約束條件檢查;延遲執(zhí)行約束是指在整個事務(wù)執(zhí)行結(jié)束后,再對約束條件進(jìn)行完整性檢查,結(jié)果正確后才能提交。BACK7.2.2完整性規(guī)則的組成一條完整性規(guī)則可以用一個五元組(D,O,A,C,P)來形式化地表示。其中:D(data):代表約束作用的數(shù)據(jù)對象;O(operation):代表觸發(fā)完整性檢查的數(shù)據(jù)庫操作,即當(dāng)用戶發(fā)出什么操作請求時需要檢查該完整性規(guī)則;A(assertion):代表數(shù)據(jù)對象必須滿足的語義約束,這是規(guī)則的主體;C(condition):代表選擇A作用的數(shù)據(jù)對象值的謂詞;P(procedure):代表違反完整性規(guī)則時觸發(fā)執(zhí)行的操作過程。BACK7.2.2完整性規(guī)則的組成例如,對于“學(xué)號不能為空”的這條完整性約束,D:代表約束作用的數(shù)據(jù)對象為SNO屬性;O(operation):當(dāng)用戶插入或修改數(shù)據(jù)時需要檢查該完整性規(guī)則;A(assertion):SNO不能為空;C(condition):A可作用于所有記錄的SNO屬性;P(procedure):拒絕執(zhí)行用戶請求。BACK7.2.3完整性約束條件的分類在數(shù)據(jù)庫領(lǐng)域中,有四種最常用的數(shù)據(jù)模型,它們是:被稱為非關(guān)系模型的層次模型、網(wǎng)狀模型、關(guān)系模型和面向?qū)ο竽P汀1菊潞喴榻B層次模型、網(wǎng)狀模型、關(guān)系模型。層次模型是數(shù)據(jù)庫系統(tǒng)中最早出現(xiàn)的數(shù)據(jù)模型,它用樹形結(jié)構(gòu)表示各類實體以及實體間的聯(lián)系。層次模型數(shù)據(jù)庫系統(tǒng)的典型代表是IBM公司的IMS(InformationManagementSystems)數(shù)據(jù)庫管理系統(tǒng),這是一個曾經(jīng)廣泛使用的數(shù)據(jù)庫管理系統(tǒng)。現(xiàn)實世界中有一些的實體之間的聯(lián)系本來就呈現(xiàn)出一種很自然的層次關(guān)系,如家庭關(guān)系,行政關(guān)系。BACK7.2.3完整性約束條件的分類
1、值的約束和結(jié)構(gòu)的約束從約束條件使用的對象來分,可把約束分為值的約束和結(jié)構(gòu)的約束。值的約束:即對數(shù)據(jù)類型、數(shù)據(jù)格式、取值范圍等進(jìn)行規(guī)定。(1)對數(shù)據(jù)類型的約束,包括數(shù)據(jù)的類型、長度、單位和精度等。例如,規(guī)定學(xué)生性別的數(shù)據(jù)類型應(yīng)為字符型,長度為2。(2)對數(shù)據(jù)格式的約束。例如,規(guī)定出生日期的數(shù)據(jù)格式為YYYY.MM.DD。(3)對取值范圍的約束。例如,月份的取值范圍為1~12,日期1~31。BACK7.2.3完整性約束條件的分類(4)對空值的約束。空值表示未定義或未知的值,它與零值和空格不同。有的列值允許空值,有的則不允許。例如,學(xué)號和課程號不可以為空值,但成績可以為空值。結(jié)構(gòu)約束:即對數(shù)據(jù)之間聯(lián)系的約束。數(shù)據(jù)庫中同一關(guān)系的不同屬性之間,應(yīng)滿足一定的約束條件,同時,不同關(guān)系的屬性之間也有聯(lián)系,也應(yīng)滿足一定的約束條件。BACK7.2.3完整性約束條件的分類常見的結(jié)構(gòu)約束有如下四種:(1)函數(shù)依賴約束:說明了同一關(guān)系中不同屬性之間應(yīng)滿足的約束條件。如:2NF,3NF,BCNF這些不同的范式應(yīng)滿足不同的約束條件。大部分函數(shù)依賴約束都是隱含在關(guān)系模式結(jié)構(gòu)中的,特別是對于規(guī)范化程度較高的關(guān)系模式,都是由模式來保持函數(shù)依賴的。(2)實體完整性約束:說明了關(guān)系主鍵(或主碼)的屬性列必須唯一,其值不能為全空或部分為空。(3)參照完整性約束:說明了不同關(guān)系的屬性之間的約束條件,即外部鍵(外碼)的值應(yīng)能夠在被參照關(guān)系的主鍵值中找到或取空值。BACK7.2.3完整性約束條件的分類(4)用戶自定義完整性:從實際應(yīng)用系統(tǒng)出發(fā),按需定義屬性之間要滿足的約束條件。(5)統(tǒng)計約束,規(guī)定某個屬性值與關(guān)系多個元組的統(tǒng)計值之間必須滿足某種約束條件。例如,規(guī)定系主任的獎金不得高于該系的平均獎金的50%,不得低于該系的平均獎金的15%。這里該系平均獎金的值就是一個統(tǒng)計計算值。其中,實體完整性約束和參照完整性約束是關(guān)系模型的兩個極其重要的約束,被稱為關(guān)系的兩個不變性。而統(tǒng)計約束實現(xiàn)起來開銷很大。BACK7.2.3完整性約束條件的分類2、靜態(tài)約束和動態(tài)約束完整性約束從約束對象的狀態(tài)可分為靜態(tài)約束和動態(tài)約束。靜態(tài)約束靜態(tài)約束是指在數(shù)據(jù)庫每一個確定狀態(tài)時的數(shù)據(jù)對象所應(yīng)滿足的約束條件,它是反映數(shù)據(jù)庫狀態(tài)合理性的約束,這是最重要的一類完整性約束。上面介紹的值的約束和結(jié)構(gòu)的約束均屬于靜態(tài)約束。動態(tài)約束動態(tài)約束是指數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)變?yōu)榱硪环N狀態(tài)時(數(shù)據(jù)庫數(shù)據(jù)變動前后),新、舊值之間所應(yīng)滿足的約束條件,它是反映數(shù)據(jù)庫狀態(tài)變遷的約束。例如,學(xué)生年齡在更改時只能增長,職工工資在調(diào)整時不得低于其原來的工資。BACK7.2.4SQLServer完整性概述
SQLServer中數(shù)據(jù)完整性可分為四種類型:實體完整性、域完整性、引用完整性、用戶定義完整性。另外,觸發(fā)器、存儲過程等也能以一定方式控制數(shù)據(jù)完整性。1、實體完整性實體完整性將行定義為特定表的唯一實體。SQLServer支持如下實體完整性相關(guān)的約束:(1)PRIMARYKEY約束:在一個表中不能有兩行包含相同的主鍵值,不能在主鍵內(nèi)的任何列中輸入NULL值。(2)UNIQUE約束:UNIQUE約束在列集內(nèi)強(qiáng)制執(zhí)行值的唯一性,對于UNIQUE約束中的列,表中不允許有兩行包含相同的非空值。BACK7.2.4SQLServer完整性概述(3)IDENTITY屬性:IDENTITY屬性能自動產(chǎn)生唯一標(biāo)識值,指定為IDENTITY的列一般作為主鍵。2、域完整性:是指給定列的輸入正確性與有效性。SQLServer中強(qiáng)制域有效性的方法有:限制類型,如通過數(shù)據(jù)類型、用戶自定義數(shù)據(jù)類型等實現(xiàn);格式限制,如通過CHECK約束和規(guī)則等實現(xiàn);列值的范圍限定,如通過PRIMARYKEY約束、UNIQUE約束、FOREIGNKEY約束、CHECK約束、DEFAULT定義、NOTNULL定義等實現(xiàn)。BACK7.2.4SQLServer完整性概述3、引用完整性(即參照完整性)SQLServer引用完整性主要由FOREIGNKEY約束體現(xiàn),它標(biāo)識表之間的關(guān)系,一個表的外鍵指向另一個表的候選鍵或唯一鍵。強(qiáng)制引用完整性時,SQLServer禁止用戶進(jìn)行下列操作:(1)當(dāng)主表中沒有關(guān)聯(lián)的記錄時,將記錄添加到相關(guān)表中。(2)更改主表中的值并導(dǎo)致相關(guān)表中的記錄孤立。BACK7.2.4SQLServer完整性概述(3)從主表中刪除記錄,但仍存在與該記錄匹配的相關(guān)記錄。在DELETE或UPDATE所產(chǎn)生的所有級聯(lián)引用操作的諸表中,每個表只能出現(xiàn)一次。多個級聯(lián)操作中只要有一個表因完整性原因操作失敗,整個操縱將失敗而回滾。4、用戶定義完整性SQLServer用戶定義完整性主要由Check約束所定義的列級或表級約束體現(xiàn),用戶定義完整性還能由規(guī)則、觸發(fā)器、客戶端或服務(wù)器端應(yīng)用程序靈活定義。BACK7.2.4SQLServer完整性概述5、觸發(fā)器SQLServer2000觸發(fā)器是一類特殊的存儲過程,被定義為在對表或視圖發(fā)出UPDATE、INSERT或DELETE語句時自動執(zhí)行。觸發(fā)器可以擴(kuò)展SQLServer約束、默認(rèn)值和規(guī)則的完整性檢查邏輯,一個表可以有多個觸發(fā)器。6、其它機(jī)制SQLServer2000支持存儲過程中制定約束規(guī)則,SQLServer2000的并發(fā)控制機(jī)制能保障多用戶存取數(shù)據(jù)時的完整性。BACK7.3數(shù)據(jù)庫并發(fā)性
5.3.1數(shù)據(jù)庫并發(fā)性概述5.3.2事務(wù)的基本概念5.3.3并發(fā)操作與數(shù)據(jù)的不一致性5.3.4封鎖及其產(chǎn)生問題的解決5.3.5SQLServer的并發(fā)控制機(jī)制返回本章首頁7.3.1數(shù)據(jù)庫并發(fā)性概述
每個用戶在存取數(shù)據(jù)庫中的數(shù)據(jù)時,可能是串行執(zhí)行,即每個時刻只有一個用戶程序運行,也可能是多個用戶并行地存取數(shù)據(jù)庫。數(shù)據(jù)庫的最大特點之一就是數(shù)據(jù)資源是共享的,串行執(zhí)行意味著一個用戶在運行程序時,其他用戶程序必須等到這個用戶程序結(jié)束才能對數(shù)據(jù)庫進(jìn)行存取,這樣數(shù)據(jù)庫系統(tǒng)的利用率會極低。數(shù)據(jù)庫并發(fā)執(zhí)行是主流。數(shù)據(jù)庫的并發(fā)控制機(jī)制能解決這類問題,以保持?jǐn)?shù)據(jù)庫中數(shù)據(jù)的在多用戶并發(fā)操作時的一致性、正確性。BACK7.3.2事務(wù)的基本概念
1、事務(wù)(Transaction)的定義
事務(wù)是數(shù)據(jù)庫系統(tǒng)中執(zhí)行的一個工作單位,它是由用戶定義的一組操作序列組成。一個事務(wù)可以是一組SQL語句、一條SQL語句或整個程序,一個應(yīng)用程序可以包括多個事務(wù)。事務(wù)的開始與結(jié)束可以由用戶顯式控制。如果用戶沒有顯式地定義事務(wù),則由DBMS按照缺省規(guī)定自動劃分事務(wù)。BACK7.3.2事務(wù)的基本概念在SQL語言中,定義事務(wù)的語句有三條:(1)BEGINTRANSACTION表示事務(wù)的開始;(控制事務(wù))(2)COMMIT表示事務(wù)的提交,即將事務(wù)中所有對數(shù)據(jù)庫的更新寫回到磁盤上的物理數(shù)據(jù)庫中去,此時事務(wù)正常結(jié)束;(3)ROLLBACK表示事務(wù)的回滾,即在事務(wù)運行的過程中發(fā)生了某種故障,事務(wù)不能繼續(xù)執(zhí)行,系統(tǒng)將事務(wù)中對數(shù)據(jù)庫的所有已完成的更新操作全部撤銷,再回滾到事務(wù)開始時的狀態(tài)。BACK7.3.2事務(wù)的基本概念2、事務(wù)的特征事務(wù)是由有限的數(shù)據(jù)庫操作序列組成,但并不是任意的數(shù)據(jù)庫操作序列都能成為事務(wù),為了保護(hù)數(shù)據(jù)的完整性,一般要求事務(wù)具有以下四個特征:(1)原子性(Atomic):一個事務(wù)是一個不可分割的工作單位,事務(wù)在執(zhí)行時,應(yīng)該遵守“要么不做,要么全做”(nothingorall)的原則,即不允許事務(wù)部分的完成。即使因為故障而使事務(wù)未能完成,它執(zhí)行的部分操作要被取消。(2)一致性(Consistency):事務(wù)對數(shù)據(jù)庫的操作使數(shù)據(jù)庫從一個一致狀態(tài)轉(zhuǎn)變到另一個一致狀態(tài)。所謂數(shù)據(jù)庫的一致狀態(tài)是指事務(wù)操作后數(shù)據(jù)庫中的數(shù)據(jù)要滿足各種完整性約束要求。BACK7.3.2事務(wù)的基本概念例如,銀行企業(yè)中,“從帳號A轉(zhuǎn)移資金額M到帳號B”是一個典型的事務(wù),這個事務(wù)包括兩個操作,從帳號A中減去資金額M和在帳號B中增加資金額M,如果只執(zhí)行其中一個操作,則數(shù)據(jù)庫處于不一致狀態(tài),帳務(wù)會出現(xiàn)問題。也就是說,兩個操作要么全做,要么全不做,否則就不能成為事務(wù)??梢娛聞?wù)的一致性與原子性是密切相關(guān)的。3、隔離性(Isolation):如果多個事務(wù)并發(fā)地執(zhí)行,應(yīng)像各個事務(wù)獨立執(zhí)行一樣,一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾。即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的。并發(fā)控制就是為了保證事務(wù)間的隔離性。BACK7.3.2事務(wù)的基本概念4、持久性(Durability):指一個事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是持久的,即使數(shù)據(jù)庫因故障而受到破壞,DBMS也應(yīng)該能夠恢復(fù)。事務(wù)上述四個性質(zhì)的英文術(shù)語的第一個字母分別為A、C、I、D。因此,這四個性質(zhì)也稱為事務(wù)的ACID準(zhǔn)則。BACK7.3.2事務(wù)的基本概念BEGINTRANSACTIONREADAA←A-MIFA<0/*A款不足*/THENBEGINDISPLAY“A款不足”ROLLBACKENDELSE/*撥款*/BEGINB←B+MDISPLAY“撥款完成”COMMITEND下面是一個事務(wù)的例子,從帳號A轉(zhuǎn)移資金額R到帳號B:BACK7.3.2事務(wù)的基本概念這是對一個簡單事務(wù)的完整的描述。該事務(wù)有兩個出口:當(dāng)A帳號的款項不足時,事務(wù)以ROLLBACK(撤銷)命令結(jié)束,即撤銷該事務(wù)的影響;另一個出口是以COMMIT(提交)命令結(jié)束,完成從帳號A到帳號B的撥款。在COMMIT之前,即在數(shù)據(jù)庫修改過程中,數(shù)據(jù)可能是不一致的,事務(wù)本身也可能被撤銷。只有在COMMIT之后,事務(wù)對數(shù)據(jù)庫所產(chǎn)生的變化才對其他事務(wù)開放,這就可以避免其他事務(wù)訪問不一致或不存在的數(shù)據(jù)。BACK7.3.3并發(fā)操作與數(shù)據(jù)的不一致性
當(dāng)同一數(shù)據(jù)庫系統(tǒng)中有多個事務(wù)并發(fā)運行時,如果不加以適當(dāng)控制,可能產(chǎn)生數(shù)據(jù)的不一致性。[例1]并發(fā)取款操作。假設(shè)存款余額R=1000元,甲事務(wù)T1取走存款200元,乙事務(wù)T2取走存款300元,如果正常操作,即甲事務(wù)T1執(zhí)行完畢再執(zhí)行乙事務(wù)T2,存款余額更新后應(yīng)該是500元。但是如果按照如下順序操作,則會有不同的結(jié)果:甲事務(wù)T1讀取存款余額R=1000元;乙事務(wù)T2讀取存款余額R=1000元;BACK7.3.3并發(fā)操作與數(shù)據(jù)的不一致性
甲事務(wù)T1取走存款200元,修改存款余額R=R-200=800,把R=800寫回到數(shù)據(jù)庫;乙事務(wù)T2取走存款300元,修改存款余額R=R-300=700,把R=700寫回到數(shù)據(jù)庫。結(jié)果兩個事務(wù)共取走存款500元,而數(shù)據(jù)庫中的存款卻只少了300元。得到這種錯誤的結(jié)果是由甲、乙兩個事務(wù)并發(fā)操作引起的。BACK7.3.3并發(fā)操作與數(shù)據(jù)的不一致性數(shù)據(jù)庫的并發(fā)操作導(dǎo)致的數(shù)據(jù)庫不一致性主要有以下三種:1、丟失更新(LostUpdate)當(dāng)兩個事務(wù)T1和T2讀入同一數(shù)據(jù)做修改,并發(fā)執(zhí)行時,T2把T1或T1把T2的修改結(jié)果覆蓋掉,造成了數(shù)據(jù)的丟失更新問題,導(dǎo)致數(shù)據(jù)的不一致。仍以[例1]中的操作為例進(jìn)行分析。在表5.5中,數(shù)據(jù)庫中R的初值是1000,事務(wù)T1包含三個操作:讀入R初值(FINDR);計算(R=R-200);更新R(UPDATER)。BACK7.3.3并發(fā)操作與數(shù)據(jù)的不一致性'表5.5丟失更新問題時間事務(wù)T1R的值事務(wù)T2t0
1000
t1FINDR
t2
FINDRt3R=R-200
t4
R=R-300t5UPDATER
t6
800UPDATERt7
700
事務(wù)T2也包含三個操作:FINDR;計算(R=R-300);UPDATER。如果事務(wù)T1和T2順序執(zhí)行,則更新后,R的值是500。但如果T1和T2按照表5.5所示的并發(fā)執(zhí)行,R的值是700,得到錯誤的結(jié)果,原因在于在t7時刻丟失了T1對數(shù)據(jù)庫的更新操作。因此,這個并發(fā)操作不正確。BACK7.3.3并發(fā)操作與數(shù)據(jù)的不一致性2、污讀(DirtyRead)事務(wù)T1更新了數(shù)據(jù)R,事務(wù)T2讀取了更新后的數(shù)據(jù)R,事務(wù)T1由于某種原因被撤消,修改無效,數(shù)據(jù)R恢復(fù)原值。事務(wù)T2得到的數(shù)據(jù)與數(shù)據(jù)庫的內(nèi)容不一致,這種情況稱為“污讀”(又名臟讀)。BACK7.3.3并發(fā)操作與數(shù)據(jù)的不一致性在表5.6中,事務(wù)T1把R的值改為900,但此時尚未做COMMIT操作,事務(wù)T2將修改過的值800讀出來,之后事務(wù)T1執(zhí)行ROLLBACK操作,R的值恢復(fù)為1000,而事務(wù)T2將仍在使用已被撤消了的R值800。時間事務(wù)T1R的值事務(wù)T2t0
1000
t1FINDR
t2R=R-200
t3UPDATER
t4
800FINDRt5ROLLBACK
t6
1000
表5.6污讀問題
BACK7.3.3并發(fā)操作與數(shù)據(jù)的不一致性原因在于在t4時刻事務(wù)T2讀取了T1未提交的更新操作結(jié)果,這種值是不穩(wěn)定的,在事務(wù)T1結(jié)束前隨時可能執(zhí)行ROLLBACK操作。對于這些未提交的隨后又被撤消的更新數(shù)據(jù)稱為“臟數(shù)據(jù)”。比如,這里事務(wù)T2在t2時刻讀取的就是“臟數(shù)據(jù)”。3、不可重讀(UnrepeatableRead)事務(wù)T1讀取了數(shù)據(jù)R,事務(wù)T2讀取并更新了數(shù)據(jù)R,當(dāng)事務(wù)T1再讀取數(shù)據(jù)R以進(jìn)行核對時,得到的兩次讀取值不一致,這種情況稱為“不可重讀”。BACK7.3.3并發(fā)操作與數(shù)據(jù)的不一致性在表5.7中,在t0時刻事務(wù)T1讀取R的值為1000,但事務(wù)T2在t4時刻將R的值更新為為700。所以T1在t5時刻所讀取R的值700已經(jīng)與開始讀取的值1000不一致了。時間事務(wù)T1R的值事務(wù)T2t0
1000
t1FINDR1000
t2
FINDRt3
R=R-300t4
700UPDATERt5FINDR700
表5.7不可重讀
BACK7.3.3并發(fā)操作與數(shù)據(jù)的不一致性產(chǎn)生上述三類數(shù)據(jù)不一致性的主要原因就是并發(fā)操作破壞了事務(wù)的隔離性。并發(fā)控制就是要求DBMS提供并發(fā)控制功能以正確的方式高度并發(fā)事務(wù),避免并發(fā)事務(wù)之間的相互干擾造成數(shù)據(jù)的不一致性,保證數(shù)據(jù)庫的完整性。BACK7.3.4封鎖及其產(chǎn)生問題的解決
實現(xiàn)并發(fā)控制的方法主要有兩種:封鎖(Lock)技術(shù)和時標(biāo)(Timestamping)技術(shù)(時標(biāo)意指一種將時間分配到事件的制度)。這里只介紹封鎖技術(shù)。1、封鎖類型(LockType)
所謂封鎖就是當(dāng)一個事務(wù)在對某個數(shù)據(jù)對象(可以是數(shù)據(jù)項、記錄、數(shù)據(jù)集、以至整個數(shù)據(jù)庫)進(jìn)行操作之前,必須獲得相應(yīng)的鎖,以保證數(shù)據(jù)操作的正確性和一致性。封鎖是目前DBMS普遍采用的并發(fā)控制方法,基本的封鎖類型有兩種:排它鎖和共享鎖。BACK7.3.4封鎖及其產(chǎn)生問題的解決(1)排它鎖(ExclusiveLock)排它鎖又稱寫鎖,簡稱為X鎖,其采用的原理是禁止并發(fā)操作。當(dāng)事務(wù)T對某個數(shù)據(jù)對象R實現(xiàn)X封鎖后,其他事務(wù)要等T解除X封鎖以后,才能對R進(jìn)行封鎖。這就保證了其他事務(wù)在T釋放R上的鎖之前,不能再對R進(jìn)行操作。(2)共享鎖(ShareLock)共享鎖又稱讀鎖,,簡稱為S鎖,其采用的原理是允許其他用戶對同一數(shù)據(jù)對象進(jìn)行查詢,但不能對該數(shù)據(jù)對象進(jìn)行修改。當(dāng)事務(wù)T對某個數(shù)據(jù)對象R實現(xiàn)S封鎖后,其他事務(wù)只能對R加S鎖,而不能加X鎖,直到T釋放R上的S鎖。這就保證了其他事務(wù)在T釋放R上的S鎖之前,只能讀取R,而不能再對R作任何修改。BACK7.3.4封鎖及其產(chǎn)生問題的解決2、封鎖協(xié)議(LockProtocol)封鎖可以保證合理的進(jìn)行并發(fā)控制,保證數(shù)據(jù)的一致性。實際上,鎖是一個控制塊,其中包括被加鎖記錄的標(biāo)識符及持有鎖的事務(wù)的標(biāo)識符等。在封鎖時,要考慮一定的封鎖規(guī)則,例如,何時開始封鎖、封鎖多長時間、何時釋放等,這些封鎖規(guī)則稱為封鎖協(xié)議。對封鎖方式規(guī)定不同的規(guī)則,就形成了各種不同的封鎖協(xié)議。封鎖協(xié)議在不同程序上對正確控制并發(fā)操作提供了一定的保證。BACK7.3.4封鎖及其產(chǎn)生問題的解決
上面講述過的并發(fā)操作所帶來的丟失更新、污讀和不可重讀等數(shù)據(jù)不一致性問題,可以通過三級封鎖協(xié)議在不同程度上給予解決,下面介紹三級封鎖協(xié)議。1、一級封鎖協(xié)議一級封鎖協(xié)議的內(nèi)容是:事務(wù)T在修改數(shù)據(jù)對象之前必須對其加X鎖,直到事務(wù)結(jié)束。具體地說,就是任何企圖更新記錄R的事務(wù)必須先執(zhí)行“XLOCKR”操作,以獲得對該記錄進(jìn)行更新的能力并對它取得X封鎖。如果未獲準(zhǔn)“X封鎖”,那么這個事務(wù)進(jìn)入等待狀態(tài),一直到獲準(zhǔn)“X封鎖”,該事務(wù)才繼續(xù)做下去。該事務(wù)規(guī)定事務(wù)在更新記錄R時必須獲得排它性封鎖,使得兩個同時要求更新R的并行事務(wù)之一必須在一個事務(wù)更新操作執(zhí)行完成之后才能獲得X封鎖,這樣就避免了兩個事務(wù)讀到同一個R值而先后更新時所發(fā)生的丟失更新問題。BACK7.3.4封鎖及其產(chǎn)生問題的解決利用一級封鎖協(xié)議可以解決表5.5中的數(shù)據(jù)丟失更新問題,如表5.8所示。事務(wù)T1先對R進(jìn)行X封鎖(XLOCK),事務(wù)T2執(zhí)行“XLOCKR”操作,未獲準(zhǔn)“X封鎖”,則進(jìn)入等待狀態(tài),直到事務(wù)T1更新R值以后,解除X封鎖操作(UNLOCKX)。此后事務(wù)T2再執(zhí)行“XLOCKR”操作,獲準(zhǔn)“X封鎖”,并對R值進(jìn)行更新(此時R已是事務(wù)T1更新過的值,R=900)。這樣就能得出正確的結(jié)果。一級封鎖協(xié)議只有當(dāng)修改數(shù)據(jù)時才進(jìn)行加鎖,如果只是讀取數(shù)據(jù)并不加鎖,所以它不能防止“污讀”和“重讀”數(shù)據(jù)。BACK7.3.4封鎖及其產(chǎn)生問題的解決表5.8無丟失更新問題時間事務(wù)T1R的值事務(wù)T2t0XLOCKR1000
t1FINDR
t2
XLOCKRt3R=R-200
WAITt4UPDATER
WAITt5UNLOCKX800WAITt6
XLOCKRt7
R=R-300t8
UPDATERt9
500UNLOCKXBACK7.3.4封鎖及其產(chǎn)生問題的解決2、二級封鎖協(xié)議二級封鎖協(xié)議的內(nèi)容是:在一級封鎖協(xié)議的基礎(chǔ)上,另外加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對其加S鎖,讀完后釋放S鎖。所以二級封鎖協(xié)議不但可以解決更新時所發(fā)生的數(shù)據(jù)丟失問題,還可以進(jìn)一步防止“污讀”。BACK7.3.4封鎖及其產(chǎn)生問題的解決利用二級封鎖協(xié)議可以解決表5.6中的數(shù)據(jù)“污讀”問題,如表5.9所示。表5.9
無污讀問題BACK時間事務(wù)T1R的值事務(wù)T2t0XLOCKR1000t1FINDRt2R=R-200t3UPDATERt4800SLOCKRt5ROLLBACKWAITt6UNLOCKR1000SLOCKRt71000FINDRt8UNLOCKS7.3.4封鎖及其產(chǎn)生問題的解決事務(wù)T1先對R進(jìn)行X封鎖(XLOCK),把R的值改為800,但尚未提交。這時事務(wù)T2請求對數(shù)據(jù)R加S鎖,因為T1已對R加了X鎖,T2只能等待,直到事務(wù)T1釋放X鎖。之后事務(wù)T1因某種原因撤銷,數(shù)據(jù)R恢復(fù)原值1000,并釋放R上的X鎖。事務(wù)T2可對數(shù)據(jù)R加S鎖,讀取R=1000,得到了正確的結(jié)果,從而避免了事務(wù)T2讀取“臟數(shù)據(jù)”。BACK7.3.4封鎖及其產(chǎn)生問題的解決3、三級封鎖協(xié)議三級封鎖協(xié)議的內(nèi)容是:在一級封鎖協(xié)議的基礎(chǔ)上,另外加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對其加S鎖,讀完后并不釋放S鎖,而直到事務(wù)T結(jié)束才釋放。所以三級封鎖協(xié)議除了可以防止更新丟失問題和“污讀”數(shù)據(jù)外,還可進(jìn)一步防止不可重讀數(shù)據(jù),徹底解決了并發(fā)操作所帶來的三個不一致性問題。利用三級封鎖協(xié)議可以解決表5.7中的不可重讀問題。BACK7.3.4封鎖及其產(chǎn)生問題的解決3、封鎖粒度(LockGranularity)封鎖對象的大小稱為封鎖粒度。根據(jù)對數(shù)據(jù)的不同處理,封鎖的對象可以是這樣一些邏輯單元:字段、數(shù)據(jù)庫等,也可以是這樣一些物理單元:頁(數(shù)據(jù)頁或索引頁)、塊等。封鎖粒度與系統(tǒng)的并發(fā)度和并發(fā)控制的開銷密切相關(guān)。封鎖粒度越小,系統(tǒng)中能夠被封鎖的對象就越多,并發(fā)度越高,但封鎖機(jī)構(gòu)復(fù)雜,系統(tǒng)開銷也就越大。封鎖粒度越大,系統(tǒng)中能夠被封鎖的對象就越少,并發(fā)度越小,封鎖機(jī)構(gòu)簡單,相應(yīng)系統(tǒng)開銷也就越小。因此,在實際應(yīng)用中,選擇封鎖粒度時應(yīng)同時考慮封鎖機(jī)制和并發(fā)度兩個因素,對系統(tǒng)開銷與并發(fā)度進(jìn)行權(quán)衡,以求得最優(yōu)的效果。BACK7.3.4封鎖及其產(chǎn)生問題的解決4、死鎖和活鎖封鎖技術(shù)可有效解決并行操作引起的數(shù)據(jù)不一致性問題,但也可產(chǎn)生新的問題,即可能產(chǎn)生活鎖和死鎖問題。1、活鎖(Livelock)當(dāng)某個事務(wù)請求對某一數(shù)據(jù)的排它性封鎖時,由于其他事務(wù)一直優(yōu)先得到對該數(shù)據(jù)的封鎖與操作而使這個事務(wù)一直處于等待狀態(tài),這種狀態(tài)形成活鎖。例如,事務(wù)T1在對數(shù)據(jù)R封鎖后,事務(wù)T2又請求封鎖R,于是T2等待。T3也請求封鎖R。當(dāng)T1釋放了R上的封鎖后,系統(tǒng)首先批準(zhǔn)了T3的請求,T2繼續(xù)等待。然后又有T4請求封鎖R,T3釋放了R上的封鎖后,系統(tǒng)又批準(zhǔn)了T4的請求…T2可能永遠(yuǎn)處于等待狀態(tài),從而發(fā)生了活鎖。如表5.11所示。BACK7.3.4封鎖及其產(chǎn)生問題的解決時間事務(wù)T1事務(wù)T2事務(wù)T3事務(wù)T4t0LOCKR
t1…LOCKR
t2…WAITLOCKR
t3UNLOCKWAITWAITLOCKRt4…WAITLOCKRWAITt5
WAIT
WAITt6
WAITUNLOCKWAITt7
WAIT
LOCKRt8
WAIT
時間事務(wù)T1事務(wù)T2t0LOCKR1
t1
LOCKR2t2
t3LOCKR2
t4WAIT
t5WAITLOCKR1t6WAITWAITt7WAITWAIT表5.11活鎖表5.12死鎖BACK7.3.4封鎖及其產(chǎn)生問題的解決2、死鎖(Deadlock)在同時處于等待狀態(tài)的兩個或多個事務(wù)中,每個事務(wù)都在等待其中另一個事務(wù)解除封鎖,它才能繼續(xù)執(zhí)行下去,結(jié)果造成任何一個事務(wù)都無法繼續(xù)執(zhí)行,這種狀態(tài)稱為死鎖。例如,事務(wù)T1在對數(shù)據(jù)R1封鎖后,又要求對數(shù)據(jù)R2封鎖,而事務(wù)T2已獲得對數(shù)據(jù)R2的封鎖,又要求對數(shù)據(jù)R1封鎖,這樣兩個事務(wù)由于都不能得到全部所需封鎖而處于等待狀態(tài),發(fā)生了死鎖。如表5.12所示。BACK7.3.4封鎖及其產(chǎn)生問題的解決(1)死鎖產(chǎn)生的條件發(fā)生死鎖的必要條件有以下四條:①互斥條件:一個數(shù)據(jù)對象一次只能被一個事務(wù)所使用,即對數(shù)據(jù)的封鎖采用排它式;②不可搶占條件:一個數(shù)據(jù)對象只能被占有它的事務(wù)所釋放,而不能被別的事務(wù)強(qiáng)行搶占;③部分分配條件:一個事務(wù)已經(jīng)封鎖分給它的數(shù)據(jù)對象,但仍然要求封鎖其他數(shù)據(jù);④循環(huán)等待條件:允許等待其他事務(wù)釋放數(shù)據(jù)對象,系統(tǒng)處于加鎖請求相互等待的狀態(tài)。BACK7.3.4封鎖及其產(chǎn)生問題的解決(2)死鎖的預(yù)防死鎖一旦發(fā)生,系統(tǒng)效率將會大大下降,因而要盡量避免死鎖的發(fā)生。在操作系統(tǒng)的多道程序運行中,由于多個進(jìn)程的并行執(zhí)行需要分別占用不同資源時,也會發(fā)生死鎖。要想預(yù)防死鎖的產(chǎn)生,就得破壞形成死鎖的條件。同操作系統(tǒng)預(yù)防死鎖的方法類似,在數(shù)據(jù)庫環(huán)境下,常用的方法有以下兩種:①一次加鎖法BACK7.3.4封鎖及其產(chǎn)生問題的解決圖5.2一次加鎖法
一次加鎖法是每個事物必須將所有要使用的數(shù)據(jù)對象全部依次加鎖,并要求加鎖成功,只要一個加鎖不成功,表示本次加鎖失敗,則應(yīng)該立即釋放所有已加鎖成功的數(shù)據(jù)對象,然后重新開始從頭加鎖。一次加鎖法的程序框圖如圖5.2。BACK7.3.4封鎖及其產(chǎn)生問題的解決一次加鎖法雖然可以有效地預(yù)防死鎖的發(fā)生,但也存在一些問題。首先,對某一事務(wù)所要使用的全部數(shù)據(jù)一次性加鎖,擴(kuò)大了封鎖的范圍,從而降低了系統(tǒng)的并發(fā)度。其次,數(shù)據(jù)庫中的數(shù)據(jù)是不斷變化的,原來不要求封鎖的數(shù)據(jù),在執(zhí)行過程中可能會變成封鎖對象,所以很難事先精確地確定每個事務(wù)所要封鎖的數(shù)據(jù)對象,這樣只能在開始擴(kuò)大封鎖范圍,將可能要封鎖的數(shù)據(jù)全部加鎖,這就進(jìn)一步降低了并發(fā)度,影響了系統(tǒng)的運行效率。BACK7.3.4封鎖及其產(chǎn)生問題的解決②順序加鎖法順序加鎖法是預(yù)先對所有可加鎖的數(shù)據(jù)對象規(guī)定一個加鎖順序,每個事務(wù)都需要按此順序加鎖,在釋放時,按逆序進(jìn)行。順序加鎖法同一次加鎖法一樣,也存在一些問題。因為事務(wù)的封鎖請求可以隨著事務(wù)的執(zhí)行而動態(tài)地決定,所以很難事先確定封鎖對象,從而更難確定封鎖順序。即使確定了封鎖順序,隨著數(shù)據(jù)操作的不斷變化,維護(hù)這些數(shù)據(jù)的封鎖順序要需要很大的系統(tǒng)開銷。BACK7.3.4封鎖及其產(chǎn)生問題的解決在數(shù)據(jù)庫系統(tǒng)中,由于可加鎖的目標(biāo)集合不但很大,而且是動態(tài)變化的;可加鎖的目標(biāo)常常不是按名尋址,而是按內(nèi)容尋址,預(yù)防死鎖常要付出很高的代價,因而上述兩種在操作系統(tǒng)中廣泛使用的預(yù)防死鎖的方法并不很適合數(shù)據(jù)庫的特點。在數(shù)據(jù)庫系統(tǒng)中,還有一種解決死鎖的辦法,即可以允許發(fā)生死鎖,但在死鎖發(fā)生后可以由系統(tǒng)及時自動診斷并解除已發(fā)生的死鎖,從而避免事務(wù)自身不可解決的資源爭用問題。BACK7.3.4封鎖及其產(chǎn)生問題的解決(3)死鎖的診斷與解除數(shù)據(jù)庫系統(tǒng)中診斷死鎖的方法與操作系統(tǒng)類似??梢岳檬聞?wù)信賴圖的形式來測試系統(tǒng)中是否存在死鎖。例如在圖5.3中,事務(wù)T1需要數(shù)據(jù)R1,但R1已經(jīng)被事務(wù)T2封鎖,那么從T1到T2劃一個箭頭。如果在事務(wù)依賴圖中沿著箭頭方向存在一個循環(huán),那么死鎖的條件就形成了,系統(tǒng)就會出現(xiàn)死鎖。圖5.3事務(wù)依賴圖BACK7.3.4封鎖及其產(chǎn)生問題的解決如果已經(jīng)發(fā)現(xiàn)死鎖,DBA從依賴相同資源的事務(wù)中抽出某個事務(wù)作為犧牲品,將它撤銷,并釋放此事務(wù)占用的所有數(shù)據(jù)資源,分配給其他事務(wù),使其他事務(wù)得以繼續(xù)運行下去,這樣就有可能消除死鎖。在解除死鎖的過程中,抽取犧牲事務(wù)的標(biāo)準(zhǔn)是根據(jù)系統(tǒng)狀態(tài)及其應(yīng)用的實際情況來確定的,通常采用的方法之一是選擇一個處理死鎖代價最小的事務(wù),將其撤銷;或從用戶等級角度考慮,取消等級低的用戶事務(wù),釋放其封鎖的資源給其它需要的事務(wù)。BACK7.3.5SQLServer的并發(fā)控制機(jī)制
SQLServer使用加鎖技術(shù)確保事務(wù)完整性和數(shù)據(jù)庫一致性。鎖定可以防止用戶讀取正在由其他用戶更改的數(shù)據(jù),并可以防止多個用戶同時更改相同數(shù)據(jù)。雖然SQLServer自動強(qiáng)制鎖定,但可以通過了解鎖定并在應(yīng)用程序中自定義鎖定來設(shè)計更有效的并發(fā)控制應(yīng)用程序。SQLServer提供如下八種鎖類型:共享(S)、更新(U)、排它(X)、意向共享(IS)、意向排它(IX)、與意向排它共享(SIX)、架構(gòu)(Sch)、大容量更新(BU),只有兼容的鎖類型才可以放置在已鎖定的資源上。BACK7.3.5SQLServer的并發(fā)控制機(jī)制SQLServer使用的主要鎖類型描述如下:①共享(S):用于不更改或不更新數(shù)據(jù)的操作(只讀操作如select語句)。資源上存在共享鎖時,任何其它事務(wù)都不能修改數(shù)據(jù);②更新(U):用于可更新的資源中。一次只有一個事務(wù)可以獲得資源的更新鎖。如果事務(wù)修改資源,則更新鎖轉(zhuǎn)換為排它(X)鎖。否則鎖轉(zhuǎn)換為共享鎖。防止當(dāng)多個會話在讀取、鎖定以及隨后可能進(jìn)行的資源更新時發(fā)生死鎖;BACK7.3.5SQLServer的并發(fā)控制機(jī)制③排它(X):用于數(shù)據(jù)修改操作例如insert、update或delete。加排它鎖后其它事務(wù)不能讀取或修改排它鎖鎖定的數(shù)據(jù)。確保不會同時對同一資源進(jìn)行多重更新;④意向(I):用于建立鎖的層次結(jié)構(gòu)。意向鎖又細(xì)分為:意向共享(IS)、意向排它(IX)以及與意向排它共享(SIX)。BACK7.3.5SQLServer的并發(fā)控制機(jī)制
在transact-sql語句使用中有如下缺省加鎖規(guī)則:select查詢?nèi)笔r請求獲得共享鎖(頁級或表級);insert語句總是請求獨占的頁級鎖;update和delete查詢通常獲得某種類型的獨占鎖以進(jìn)行數(shù)據(jù)修改;如果當(dāng)前將被修改的頁上存在讀鎖,則delete或update語句首先會得到修改鎖,當(dāng)讀過程結(jié)束以后,修改鎖自動改變?yōu)楠氄兼i。BACK7.3.5SQLServer的并發(fā)控制機(jī)制可以使用select、insert、update和delete語句指定表級鎖定提示的范圍,以引導(dǎo)SQLServer使用所需的鎖類型。當(dāng)需要對對象所獲得鎖類型進(jìn)行更精細(xì)控制時,可以使用手工鎖定提示如:holdlock、nolock、paglock、readpast、rowlock、tablock、tablockx、updlock、xlock等,這些鎖定提示取代了會話的當(dāng)前事務(wù)隔離級別指定的鎖。例如查詢時,可強(qiáng)制設(shè)定加獨占鎖,命令為:selectsnofromstudentwith(tablockx)wheredept='CS'BACK7.3.5SQLServer的并發(fā)控制機(jī)制SQLServer具有多粒度鎖定能力,允許一個事務(wù)鎖定不同類型的資源。為了使鎖定的成本減至最少,SQLServer自動將資源鎖定在適合任務(wù)的級別。鎖定在較小的粒度(例如行)可以增加并發(fā)但需要較大的開銷,因為如果鎖定了許多行,則需要控制更多的鎖。鎖定在較大的粒度(例如表)就并發(fā)而言是相當(dāng)昂貴的,因為鎖定整個表限制了其它事務(wù)對表中任意部分進(jìn)行訪問,但要求的開銷較低,因為需要維護(hù)的鎖較少。BACK7.3.5SQLServer的并發(fā)控制機(jī)制SQLServer可以鎖定以下資源,見表7.13。表7.13資源加鎖粒度表資源描述RID行標(biāo)識符。用于單獨鎖定表中的一行。鍵索引中的行鎖。用于保護(hù)可串行事務(wù)中的鍵范圍。頁8千字節(jié)(KB)的數(shù)據(jù)頁或索引頁。擴(kuò)展盤區(qū)相鄰的八個數(shù)據(jù)頁或索引頁構(gòu)成的一組。表包括所有數(shù)據(jù)和索引在內(nèi)的整個表。DB數(shù)據(jù)庫。BACK7.3.5SQLServer的并發(fā)控制機(jī)制
事務(wù)準(zhǔn)備接受不一致數(shù)據(jù)的級別稱為隔離級別。隔離級別是一個事務(wù)必須與其它事務(wù)進(jìn)行隔離的程度。較低的隔離級別可以增加并發(fā),但代價是降低數(shù)據(jù)的正確性。相反,較高的隔離級別可以確保數(shù)據(jù)的正確性,但可能對并發(fā)產(chǎn)生負(fù)面影響。應(yīng)用程序要求的隔離級別確定了SQLServer使用的鎖定行為。如:settransactionisolationlevelrepeatableread--設(shè)置為可重復(fù)讀BACK7.3.5SQLServer的并發(fā)控制機(jī)制SQL-92定義了下列四種隔離級別,如下由低到高的四種隔離級別:readuncommitted、readcommitted、repeatableread、serializable,默認(rèn)情況下,SQLServer在readcommitted隔離級別上操作。但是應(yīng)用程序可能必須運行于不同的隔離級別。若要在應(yīng)用程序中使用更嚴(yán)格或較寬松的隔離級別,可以使用Transact-SQL或通過數(shù)據(jù)庫API來設(shè)置事務(wù)隔離級別,來自定義整個會話的鎖定。如:settransactionisolationlevelrepeatableread--設(shè)置為可重復(fù)讀BACK7.3.5SQLServer的并發(fā)控制機(jī)制隔離級別含義如下:①readuncommitted:執(zhí)行臟讀或0級隔離鎖定,這表示事務(wù)中不發(fā)出共享鎖,也不接受排它鎖。當(dāng)設(shè)置該選項時,可以對數(shù)據(jù)執(zhí)行未提交讀或臟讀;在事務(wù)結(jié)束前可以更改數(shù)據(jù)內(nèi)的數(shù)值,行也可以出現(xiàn)在數(shù)據(jù)集中或從數(shù)據(jù)集消失。該選項的作用與在事務(wù)內(nèi)所有語句中的所有表上設(shè)置nolock相同。這是四個隔離級別中限制最小的級別。②readcommitted:指定在讀取數(shù)據(jù)時控制共享鎖以避免臟讀,但數(shù)據(jù)可在事務(wù)結(jié)束前更改,從而產(chǎn)生不可重復(fù)讀取或幻影數(shù)據(jù)。該選項是SQLServer的默認(rèn)值。
BACK7.3.5SQLServer的并發(fā)控制機(jī)制③repeatableread:鎖定查詢中使用的所有數(shù)據(jù)以防止其他用戶更新數(shù)據(jù),但是其他用戶可以將新的幻影行插入數(shù)據(jù)集,且幻影行包括在當(dāng)前事務(wù)的后續(xù)讀取中。④
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 年度氟鋁酸鈣鋰晶體(LICAALF)市場分析及競爭策略分析報告
- 二零二五年電子競技賽事運營合同正規(guī)范本3篇
- 工程驗收委托合同年
- 星系團(tuán)大爆炸機(jī)制-洞察分析
- 制造業(yè)產(chǎn)品開發(fā)采購協(xié)議
- 專業(yè)消防系統(tǒng)檢測服務(wù)協(xié)議2024版版
- 二零二五年度車位買賣及續(xù)期合同示范文本
- 九年級數(shù)學(xué)核心知識點與常見題型通關(guān)講解練(滬科版)-重難點專項突破10解直角三角形之“背靠背”模型(解析版)
- 35kv變電站施工用材料采購合同.二零二四年
- 二零二五版?zhèn)€人生活擔(dān)保服務(wù)協(xié)議范本3篇
- CLSIM100-S24英文版 抗菌藥物敏感性試驗執(zhí)行標(biāo)準(zhǔn);第二十四版資料增刊
- 空調(diào)作業(yè)規(guī)程3篇
- 物業(yè)項目服務(wù)進(jìn)度保證措施
- (隱蔽)工程現(xiàn)場收方計量記錄表
- DB22T 5005-2018 注塑夾芯復(fù)合保溫砌塊自保溫墻體工程技術(shù)標(biāo)準(zhǔn)
- 醫(yī)院手術(shù)室醫(yī)院感染管理質(zhì)量督查評分表
- 稱量與天平培訓(xùn)試題及答案
- 超全的超濾與納濾概述、基本理論和應(yīng)用
- 2020年醫(yī)師定期考核試題與答案(公衛(wèi)專業(yè))
- 2022年中國育齡女性生殖健康研究報告
- 消防報審驗收程序及表格
評論
0/150
提交評論