第5章 數據庫安全保護_第1頁
第5章 數據庫安全保護_第2頁
第5章 數據庫安全保護_第3頁
第5章 數據庫安全保護_第4頁
第5章 數據庫安全保護_第5頁
已閱讀5頁,還剩126頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章數據庫安全保護

本章要點

隨著社會信息化的不斷深化,各種數據庫的使

用也越來越廣泛。例如,一個企業管理信息系統的

全部數據、國家機構的事務管理信息、國防情報機

密信息、基于WEB動態發布的網上購物信息等等,它

們都集中或分布地存放在大大小小的數據庫中。我

們知道數據庫系統中的數據是由DBMS統一進行管理

和控制的。為了適應和滿足數據共享的環境和要求,

DBMS要保證數據庫及整個系統的正常運轉,防止數

據意外丟失和不一致數據的產生,以及當數據庫遭

受破壞后能迅速地恢復正常,這就是數據庫的安全

保護。

第5章數據庫安全保護

本章要點

DBMS對數據庫的安全保護功能是通過四方面來實

現的,即安全性控制、完整性控制、并發性控制和數

據庫恢復。本章就將從這四方面來介紹數據庫的安全

保護功能,重點要求讀者掌握它們的含義及實現這些

安全保護功能的方法,可結合SQLServer2000加深四

部分內容的理解與操作技能。

本章邏輯結構

5.1.1.數據庫安全性概述

5.12安全性控制的一般方法

5.1.3.安全性控制的其它方法

5.14SQLServer2000安全性概述

521.數據庫完整性概述

5.22完整性規則的組成

523.完整性約束條件的分類

5.24SQLServer2000完整性概述

首頁?上一頁?下一頁?尾頁?結束?返回?謁音

本章邏輯結構

5.32事務的基本概念

5.33并發操作與數據的不一致性

53.4.封鎖及其產生問題的解決

5.3.5.SQLServer2000的并發控制機制

5.4」.數據庫恢復概述

5.42數據庫恢復的基本原理及其實現技術

54.3.數據庫的故障及其恢復策略

544.SQLServer2000的備份和還原機制

5.53小結習題

5.1.1數據庫安全性概述

數據庫的安全性是指保護數據庫,以防止非法使用

所造成數據的泄露、更改或破壞。

安全性問題有許多方面,其中包括:

(1)法律、社會和倫理方面,例如請求查詢信息的人是不

有合法的權力;

(2)物理控制方面,例如計算機機房或終端是否應該加鎖

或用其他方法加以保護;

(3)政策方面,確定存取原則,允許哪些用戶存取哪些數

據;

(4)運行與技術方面,使用口令時,如何使口令保持秘密;

5.1.1數據庫安全性概述

(5)硬件控制方面,CPU是否提供任何安全性方面的功

能,諸如存儲保護鍵或特權工作方式;

(6)操作系統安全性方面,在主存儲器和數據文件用過

以后,操作系統是否把它們的內容清除掉;

(7)數據庫系統本身安全性方面。

5.1.2安全性控制的一般方法

安全性控制是指要盡可能地杜絕所有可能的數據

庫非法訪問。用戶非法使用數據庫可以有很多種情況

o例如,編寫合法的程序繞過DBMS授權機制,通過操

作系統直接存取、修改或備份有關數據。用戶訪問非

法數據,無論它們是有意的還是無意的,都應該加以嚴

格控制,因此,系統還要考慮數據信息的流動問題并

加以控制,否則有潛在的危險性。因為數據的流動可

能使無權訪問的用戶獲得訪問權利。

5.1.2安全性控制的一般方法

例如,甲用戶可以訪問表T1,但無權訪問表T2,

如果乙用戶把表T2的所有記錄添加到表T1中之后,則

由于乙用戶的操作,使甲用戶獲得了對表T2中記錄的

訪問。此外,用戶可以多次利用允許的訪問結果,經

過邏輯推理得到他無權訪問的數據。

為防止這一點,訪問的許可權還要結合過去訪問

的情況而定。可見安全性的實施是要花費一定代價,

并需縝密考慮的。安全保護策略就是要以最小的代價

來最大程度防止對數據的非法訪問,通常需要層層設

置安全措施。

實際上,數據庫系統的安全性問題,類似于整人

計算機系統一級級層層設置安全的情況,其安全控制

模型一般如圖5.1所示。

5.1.2安全性控制的一般方法

根據圖5.1的安全模型,當用戶進入計算機系統時,系

統首先根據輸入的用戶標識進行身份的鑒定,只有合法的

用戶才準許進入系統。

對已進入系統的用戶,DBMS還要進行存取控制,只允許

用戶進行合法的操作

5.1.2安全性控制的一般方法

DBMS是建立在操作系統之上的,安全的操作系統

是數據庫安全的前提。操作系統應能保證數據庫中的

數據必須由DBMS訪問,而不允許用戶越過DBMS,直接

通過操作系統或其它方式訪問。

數據最后可以通過密碼的形式存儲到數據庫中。

能做到非法者即使得到了加密數據,也無法識別它的

安全效果。

下面,本書就同數據庫有關的用戶標識和鑒定、

存取控制、定義視圖、數據加密和審計等幾類安全性

措施作一討論。

5.1.2安全性控制的一般方法

1、用戶標識和鑒別

用戶標識和鑒定是系統提供的最外層的安全保護措

施,其方法是由系統提供一定的方式讓用戶標識自己

的名字或身份,系統內部記錄著所有合法用戶的標識,

每次用戶要求進入系統時,由系統進行核實,通過鑒

定后才提供機器的使用權。

用戶標識和鑒定的方法有:

(1)單用戶名鑒別法:用一個用戶名或用戶標識符來標

明用戶的身份,系統以此來鑒別用戶的合法性.

5.1.2安全性控制的一般方法

⑵用戶名與口令聯合鑒別法:用戶標識符是用戶公開的

標識,它不足以成為鑒別用戶身份的憑證。

⑶透明公式鑒別法:每個用戶都預先約定好一個過程或

者函數,鑒別用戶身份時,系統提供一個隨機數,用

戶根據自己預先約定的計算過程或者函數進行計算,

系統根據計算結果辨別用戶身份的合法性。

5.1.2安全性控制的一般方法

2、用戶存取權限控制

用戶存取權限指的是不同的用戶對于不同的數據對象

允許執行的操作權限。

存取權限由兩個要素組成,數據對象和操作類型。定

義一個用戶的存取權限就是要定義這個用戶可以在哪些數

據對象上進行哪些類型的操作。

在數據庫系統中,定義用戶存取權限稱為授權.

授權有兩種:

(1)系統權限:由DBA授予某些數據庫用戶,只有得到

系統權限,才能成為數據庫用戶.

5.1.2安全性控制的一般方法

(2)對象權限:可以由DBA授予,也可以由數據對

象的創建者授予,使數據庫用戶具有對某些數據對象

進行某些操作的權限.

這些授權定義經過編譯后以一張授權表的形式存

放在數據字典中。授權表主要有三個屬性,用戶標識、

數據對象和操作類型。

5.1.2安全性控制的一般方法

3、視圖機制

為不同的用戶定義不同的視圖,可以限制各個用戶

的訪問范圍。通過視圖機制把要保密的數據對無權存

取這些數據的用戶隱藏起來,從而自動地對數據提供

一定程度的安全保護。

4、數據加密

數據加密是防止數據庫中數據在存儲和傳輸中失

密的有效手段.加密的基本思想是根據一定的算法將原

始數據加密成為不可直接識別的格式,數據以密碼的形

式存儲和傳輸.

5.1.2安全性控制的一般方法

加密方法有兩種:

(1)替換方法:該方法使用密鑰將明文中的每一個字符

轉換為密文中的一個字符.

(2)轉換方法:該方法將明文中的字符按不同的順序重

新排列.

用密碼存儲數據,在存入時需加密,在查詢時需解密,

這個過程會占用較多的系統資源,降低了數據庫的性能。

5、審計

、實際上任何系統的安全性措施都不是絕對可靠的,竊

密者總有辦法打破這些控制.審計功能是一種監視措施,

跟蹤記錄有關數據的訪問活動.

5.1.3安全性控制的其它方法

1、強制存取控制(MAC)

有些數據庫系統的數據要求很高的保密性,通常具有

靜態的嚴格的分層結構,強制存取控制能實現這種高保密

性要求.這種方法的基本思想在于每個數據對象(文件、記

錄記錄或宇段等)賦予一定的密級,級別從高到低有:絕密

級、機密級、秘密級和公用級.每個用戶也具有相應的級別,

稱為許可證級別.

在系統運行時,采用如下兩條簡單規則:

(1)用戶U只能查看比它級別低或同級的數據.

(2)用戶U只能修改和它同級的數據.

強制存取控制是一種獨立于值的控制方法,它的優點是

系統能執行“信息流控制”.

5.1.3安全性控制的其它方法

2、統計數據庫的安全性

查詢僅僅是某些記錄的統計值,例如求記錄數、和、

平均值等。在統計數據庫中,雖然不允許用戶查詢單

個記錄的信息,但是用戶可以通過處理足夠多的匯總

信息來分析出單個記錄的信息.

在統計數據庫中,對查詢應作下列限制:

①一個查詢查到的記錄個數至少是n;

②兩個查詢查到的記錄的“交”數目至多是m.

保證數據庫安全性的另一個方法是“數據污染”,

也就是在回答查詢時,提供一些偏離正確值的數據,

以免數據泄露.

5.1.4SQLServer2000安全性概述

SQLServer2000安全系統的構架建立在用戶和用

戶組的基礎上.SQLServer提供了3種安全管理模式,

即標準模式、集成模式和混合模式,數據庫設計者和

數據庫管理員可以根據實際情況進行選擇.

1、兩個安全性階段:身份驗證和授權.

2、用戶權限:登錄創建在Windows中,而非SQL

Server中.

5.1.4SQLServer2000安全性概述

當用戶連接到SQLServer2000實例后,他們可以

執行的活動由授予以下帳戶的權限確定:

(1)用戶的安全帳戶;

(2)用戶的安全帳戶所屬Windows組或角色層次結;

(3)用戶若要進行任何涉及更改數據庫定義或訪問

數據的活動,則必須有相應的權限.

首頁?上一頁?下一頁?尾頁?結束?返回?謁音

5.1.4SQLServer2000安全性概述

3、視圖安全機制

SQLServer2000通過限制可由用戶使用的數據,可

以將視圖作為安全機制。用戶可以訪問某些數據,進

行查詢和修改,但是表或數據庫的其余部分是不可見

的,也不能進行訪問。

4、加密方法

SQLServer2000支持加密或可以加密的內容為:①

SQLServer中存儲的登錄和應用程序角色密碼;②作

為網絡數據包而在客戶端和服務器端之間發送的數據;

③SQLServer2000中如下對象的定義內容:存儲過程、

用戶定義函數、視圖、觸發器、默認值、規則等。

5.1.4SQLServer2000安全性概述

5、審核活動

SQLServer2000提供審核功能,用以跟蹤和記

錄每個SQLServer實例上已發生的活動(如成功和

失敗的記錄)。SQLServer2000還提供管理審核記

錄的接口,即SQL事件探查器。只有sysadmin固定

安全角色的成員才能啟用或修改審核,而且審核的每

次修改都是可審核的事件。

5.2.1數據庫完整性概述

數據庫的完整性是指保護數據庫中數據的正確性、有效性

和相容性,防止錯誤的數據進入數據庫造成無效操作。

顯然,維護數據庫的完整性非常重要,數據庫中的數據是

否具備完整性關系到數據能否真實地反映現實世界。

數據庫的完整性和安全性是數據庫保護的兩個不同的方面。

安全性是保護數據庫,以防止非法使用所造成數據的泄露、

更改或破壞,安全性措施的防范對象是非法用戶和非法操作;

完整性是防止合法用戶使用數據庫時向數據庫中加入不符合語

義的數據,完整性措施的防范對象是不合語義的數據。

5.2.2完整性規則的組成

完整性規則主要由以下三部分構成:

(1)觸發條件:規定系統什么時候使用規則檢查數據;

(2)約束條件:規定系統檢查用戶發出的操作請求違背了

什么樣的完整性約束條件;

(3)違約響應:規定系統如果發現用戶的操作請求違背了

完整性約束條件,應該采取一定的動作來保證數據的完整

性,即違約時要做的事情。

完整性規則從執行時間上可分為立即執行約束

(ImmediateConstraints)和延遲執行約束(Deferred

Constraints)

立即執行約o。束是指在執行用戶事務過程中,某一條語句

執行完成后,系統立即對此數據進行完整性約束條件檢查;

延遲執行約束是指在整個事務執行結束后,再對約束條件

進行完整性檢查,結果正確后才能提交。

5.2.2完整性規則的組成

一條完整性規則可以用一個五元組(D,O,A,C,P)

來形式化地表示。其中:

D(data):代表約束作用的數據對象;

0(operation):代表觸發完整性檢查的數據庫操作,

即當用戶發出什么操作請求時需要檢查該完整性規則;

A(assertion):代表數據對象必須滿足的語義約束,這

是規則的主體;

C(condition):代表選擇A作用的數據對象值的謂詞;

P(procedure):代表違反完整性規則時觸發執行的操

作過程。

5.2.2完整性規則的組成

例如,對于“學號不能為空”的這條完整性約束,

D:代表約束作用的數據對象為SNO屬性;

O(operation):當用戶插入或修改數據時需要檢查該完

整桂規則;

A(assertion):SNO不能為空;

C(condition):A可作用于所有記錄的SNO屬性;

P(procedure):拒絕執行用戶請求。

5.2.3完整性約束條件的分類

?在數據庫領域中,有四種最常用的數據模型,它們是:

被稱為非關系模型的層次模型、網狀模型、關系模型

和面向對象模型。本章簡要介紹層次模型、網狀模型、

關系模型。

?層次模型是數據庫系統中最早出現的數據模型,它用

樹形結構表示各類實體以及實體間的聯系。層次模型

數據庫系統的典型代表是IBM公司的IMS(Information

ManagementSystems)數據庫管理系統,這是一個曾

經廣泛使用的數據庫管理系統。現實世界中有一些的

實體之間的聯系本來就呈現出一種很自然的層次關系,

如家庭關系,行政笑素。

5.2.3完整性約束條件的分類

1、值的約束和結構的約束

從約束條件使用的對象來分,可把約束分為值的約束和

結構的約束。

?值的約束:即對數據類型、數據格式、取值范圍等進行

規定。

(1)對數據類型的約束,包括數據的類型、長度、單位和

精度等。例如,規定學生性別的數據類型應為字符型,

長度為2。

(2)對數據格式的約束。例如,規定出生日期的數據格式

為YYYY.MM.DDo

(3)對取值范圍的約束。例如,月份的取值范圍為1?12,

日期1?31。

5.2.3完整性約束條件的分類

(4)對空值的約束。空值表示未定義或未知的值,它與

零值和空格不同。有的列值允許空值,有的則不允許。

例如,學號和課程號不可以為空值,但成績可以為空

值。

?結構約束:即對數據之間聯系的約束。

數據庫中同一關系的不同屬性之間,應滿足一定

的約束條件,同時,不同關系的屬性之間也有聯系,

也應滿足一定的約束條件。

5.2.3完整性約束條件的分類

常見的結構約束有如下四種:

(1)函數依賴約束:說明了同一關系中不同屬性之間應

滿足的約束條件。如:2NF,3NF,BCNF這些不同的

范式應滿足不同的約束條件。大部分函數依賴約束都

是隱含在關系模式結構中的,特別是對于規范化程度

較高的關系模式,都是由模式來保持函數依賴的。

(2)實體完整性約束:說明了關系主鍵(或主碼)的屬

性列必須唯一,其值不能為全空或部分為空。

(3)參照完整性約束:說明了不同關系的屬性之間的約

束條件,即外部鍵(外碼)的值應能夠在被參照關系

的主鍵值中找到或取空值。

5.2.3完整性約束條件的分類

(4)用戶自定義完整性:從實際應用系統出發,按需定

義屬性之間要滿足的約束條件。

(5)統計約束,規定某個屬性值與關系多個元組的統計

值之間必須滿足某種約束條件。例如,規定系主任的

獎金不得高于該系的平均獎金的50%,不得低于該系

的平均獎金的15%。這里該系平均獎金的值就是一個

統計計算值。

其中,實體完整性約束和參照完整性約束是關系

模型的兩個極其重要的約束,被稱為關系的兩個不變

性。而統計約束實現起來開銷很大。

5.2.3完整性約束條件的分類

完整性約束從約束對象的狀態可分為靜態約束和動態約束。

?靜態約束

靜態約束是指在數據庫每一個確定狀態時的數據對象所應滿足的

約束條件,它是反映數據庫狀態合理性的約束,這是最重要的一

類完整性約束。上面介紹的值的約束和結構的約束均屬于靜態約

束。

?動態約束

動態約束是指數據庫從一種狀態轉變為另一種狀態時(數據庫數

據變動前后),新、舊值之間所應滿足的約束條件,它是反映數

據庫狀態變遷的約束。

例如,學生年齡在更改時只能增長,職工工資在調整時不得

低于其原來的工資。

5.2.4SQLServer2000完整性概述

SQLServer2000中數據完整性可分為四種類型:實體完

整性、域完整性、引用完整性、用戶定義完整性。另外,

觸發器、存儲過程等也能以一定方式控制數據完整性。

1、實體完整性

實體完整性將行定義為特定表的唯一實體。SQLServer

2000支持如下實體完整性相關的約束:

(1)PRIMARYKEY約束:在一個表中不能有兩行包含相同的

主鍵值,不能在主鍵內的任何列中輸入NULL值。

(2)UNIQUE約束:UNIQUE約束在列集內強制執行值的唯一

性,對于UNIQUE約束中的列,表中不允許有兩行包含相

同的非空值。

5.2.4SQLServer2000完整性概述

(3)IDENTITY屬性:IDENTITY屬性能自動產生唯一標識

值,指定為IDENTITY的列一般作為主鍵。

2、域完整性:是指給定列的輸入正確性與有效性。SQL

Server2000中強制域有效性的方法有:限制類型,如

通過數據類型、用戶自定義數據類型等實現;格式限

制,如通過CHECK約束和規則等實現;列值的范圍限定,

如通過PRIMARYKEY約束、UNIQUE約束、FOREIGN

KEY約束、CHECK約束、DEFAULT定義、NOTNULL定義

等實現。

5.2.4SQLServer2000完整性概述

3、引用完整性(即參照完整性)

SQLServer2000引用完整性主要由FOREIGNKEY約束

體現,它標識表之間的關系,一個表的外鍵指向另一個

表的候選鍵或唯一鍵。

強制引用完整性時,SQLServer禁止用戶進行下列操作:

(1)當主表中沒有關聯的記錄時,將記錄添加到相關表

中。

(2)更改主表中的值并導致相關表中的記錄孤立。

5.2.4SQLServer2000完整性概述

(3)、從主表中刪除記錄,但仍存在與該記錄匹配的相關

記錄。

在DELETE或UPDATE所產生的所有級聯引用操作的諸

表中,每個表只能出現一次。多個級聯操作中只要有

一個表因完整性原因操作失敗,整個操縱將失敗而回

滾。

4、用戶定義完整性

SQLServer2000用戶定義完整性主要由Check約束

所定義的列級或表級約束體現,用戶定義完整性還能

由規則、觸發器、客戶端或服務器端應用程序靈活定

義。

5.2.4SQLServer2000完整性概述

5、觸發器

SQLServer2000觸發器是一類特殊的存儲過程,被

定義為在對表或視圖發出UPDATE、INSERT或DELETE

語句日才自動執行。觸爰器可以擴展SQLServer約束、

默認值和規則的完整性檢查邏輯,一個表可以有多個

觸發器。

6、其它機制

SQLServer2000支持存儲過程中制定約束規則,SQL

Server2000的并發控制機制能保障多用戶存取數據時

的完整性。

5.3.1數據庫并發性概述

?每個用戶在存取數據庫中的數據時,可能是串行執行,

即每個時刻只有一個用戶程序運行,也可能是多個用戶

并行地存取數據庫。

?數據庫的最大特點之一就是數據資源是共享的,串行執

行意味著一個用戶在運行程序時,其他用戶程序必須等

到這個用戶程序結束才能對數據庫進行存取,這樣數據

庫系統的利用率會極低。

?數據庫的并發控制機制能解決這類問題,以保持數據庫

中數據的在多用戶并發操作時的一致性、正確性。

5.3.2事務的基本概念

1、事務(Transaction)的定義

事務是數據庫系統中執行的一個工作單位,它是

由用戶定義的一組操作序列組成。

一個事務可以是一組SQL語句、一條SQL語句或整

個程序,一個應用程序可以包括多個事務。事務的開

始與結束可以由用戶顯式控制。如果用戶沒有顯式地

定義事務,則由DBMS按照缺省規定自動劃分事務。

5.3.2事務的基本概念

在SQL語言中,定義事務的語句有三條:

(1)BEGINTRANSACTION表示事務的開始;

⑵COMMIT表示事務的提交,即將事務中所有對

數據庫的更新寫回到磁盤上的物理數據庫中去,

此時事務正常結束;

⑶ROLLBACK表示事務的回滾,即在事務運行的

過程中發生了某種故障,事務不能繼續執行,

系統將事務中對數據庫的所有已完成的更新操

作全部撤銷,再回滾到事務開始時的狀態。

5.3.2事務的基本概念

2、事務的特征

事務是由有限的數據庫操作序列組成,但并不是任意的

數據庫操作序列都能成為事務,為了保護數據的完整性,一

般要求事務具有以下四個特征:

(1)原子性(Atomic):一個事務是一個不可分割的工作單

位,事務在執行時,應該遵守“要么不做,要么全做”

(nothingorall)的原則,即不允許事務部分的完成。即

使因為故障而使事務未能完成,它執行的部分操作要被取消。

(2)一致性(Consistency):事務對數據庫的操作使數據庫

從一個一致狀態轉變到另一個一致狀態。所謂數據庫的一致

狀態是指事務操作后數據庫中的數據要滿足各種完整性約束

要求。

5.3.2事務的基本概念

例如,銀行企業中,“從帳號A轉移資金額M到帳

號中是一個典型的事務,這個事務包括兩個操作,從

帳號A中減去資金額M和在帳號B中增加資金額M,如果

只執行其中一個操作,則數據庫處于不一致狀態,帳

務會出現問題。也就是說,兩個操作要么全做,要么

全不做,否則就不能成為事務。可見事務的一致性與

原子性是密切相關的。

3、隔離性(Isolation):如果多個事務并發地執行,

應像各個事務獨立執行一樣,一個事務的執行不能被

其他事務干擾。即一個事務內部的操作及使用的數據

對并發的其他事務是隔離的。并發控制就是為了保證

事務間的隔離性。

5.3.2事務的基本概念

4、持久性(Durability):指一個事務一旦提交,它對

數據庫中數據的改變就應該是持久的,即使數據庫因

故障而受到破壞,DBMS也應該能夠恢復。

事務上述四個性質的英文術語的第一個字母分別

為A、C、I、Do因此,這四個性質也稱為事務的ACID

準則。

5.3.2事務的基本概念

F面是一個事務的例子,從帳號A轉移資金額R到帳號B:

BEGINTRANSACTION

READA

A<-A-MEND

IFA<0/*A款不足*/ELSE/*撥款*/

THENBEGIN

BEGINB-B+M

DISPLAY“A款不足”DISPLAY"撥款完成”

COMMIT

ROLLBACK

END

5.3.2事務的基本概念

這是對一個簡單事務的完整的描述。該事務有兩

個出口:當A帳號的款項不足時,事務以ROLLBACK

(撤銷)命令結束,即撤銷該事務的影響;另一個出

口是以COMMIT(提交)命令結束,完成從帳號A到帳號

B的撥款。在COMMIT之前,即在數據庫修改過程中,數

據可能是不一致的,事務本身也可能被撤銷。只有在

COMMIT之后,事務對數據庫所產生的變化才對其他事

務開放,這就可以避免其他事務訪問不一致或不存在

的數據。

5.3,3并發操作與數據的不一致性

當同一數據庫系統中有多個事務并發運行時,如

果不加以適當控制,可能產生數據的不一致性。

[例1]并發取款操作。假設存款余額R=1000元,甲事

務T1取走存款200元,乙事務T2取走存款300元,如果

正常操作,即甲事務T1執行完畢再執行乙事務T2,存

款余額更新后應該是500元。但是如果按照如下順序操

作,則會有不同的結果:

甲事務T1讀取存款余額R二1000元;

乙事務T2讀取存款余額R二1000元;

5.3,3并發操作與數據的不一致性

甲事務T1取走存款200元,修改存款余額R二R

-200=800,把R=800寫回到數據庫;

乙事務T2取走存款300元,修改存款余額R=R

-300=700,把R=700寫回到數據庫。

結果兩個事務共取走存款500元,而數據庫中

的存款卻只少了300元。得到這種錯誤的結果是由

甲、乙兩個事務并發操作引起的。

5.3.3并發操作與數據的不一致性

數據庫的并發操作導致的數據庫不一致性主要有以

下二種:

1、丟失更新(LostUpdate)

當兩個事務T1和T2讀入同一數據做修改,并發執

行時,T2把T1或T1把T2的修改結果覆蓋掉,造成了數

據的丟失更新問題,導致數據的不一致。

仍以[例1]中的操作為例進行分析。在表5.5中,數

據庫中R的初值是1000,事務T1包含三個操作:讀入R

初值(FINDR);計算(R=R-200);更新R

(UPDATER)o

5.3.3并發操作與數據的不一致性

表丟失更新問題

事務T2也包含三個操作:5.5

FINDR;計算(R=R-300);時間事務T1R的值事務T2

UPDATERoto1000

如果事務T1和T2順序執行,t1FINDR

則更新后,R的值是500。但如t2FINDR

果T1和T2按照表5.5所示的并發t3R=R-200

執行,R的值是700,得到錯誤t4R=R-300

的結果,原因在于在時刻丟

t7t5UPDATER

失了T1對數據庫的更新操作。

因此,這個并發操作不正確。t6800UPDATER

t7700

5.3.3并發操作與數據的不一致性

2、污讀(DirtyRead)

事務T1更新了數據R,事務T2讀取了更新

后的數據R,事務T1由于某種原因被撤消,修

改無效,數據R恢復原值。事務T2得到的數據

與數據庫的內容不一致,這種情況稱為“污讀”

(又名臟讀)。

5.3.3并發操作與數據的不一致性

在表5.6中,事務T1把R表5.6污讀問題

的值改為900,但此時尚時間事務T1R的值事務T2

未做COMMIT操作,事務T2

to1000

將修改過的值800讀出來,

t1FINDR

之后事務T1執行ROLLBACK

操作,R的值恢復為1000,R=R-200

而事務T2將仍在使用已被t3UPDATE

___r_x_D_____

撤消了的R值800。800FINDR

ROLLBAC

K

t61000

5.3.3并發操作與數據的不一致性

原因在于在t4時刻事務T2讀取了T1未提交的更新

操作結果,這種值是不穩定的,在事務T1結束前隨時

可能執行ROLLBACK操作。

對于這些未提交的隨后又被撤消的更新數據稱為

“臟數據”。比如,這里事務T2在t2時刻讀取的就是

“臟數據”。

3、不可重讀(UnrepeatableRead)

事務T1讀取了數據R,事務T2讀取并更新了數據

R,當事務T1再讀取數據R以進行核對時,得到的兩次

讀取值不一致,這種情況稱為“不可重讀”。

5.3.3并發操作與數據的不一致性

在表5.7中,在tO表5.7不可重讀

時刻事務T1讀取R的事務T2]

時間事務T1R的值

值為1000,但事務

T2在t4時刻將R的值to1000

更新為為700。所以t1FIND1000

R

T1在t5時刻所讀取Rt2FINDR

的值700已經與開始t3R=R-300

讀取的值1000不一致t4700UPDATE

ToR

FIND700

R

5.3.3并發操作與數據的不一致性

產生上述三類數據不一致性的主要原因就是并發

操作破壞了事務的隔離性。并發控制就是要求DBMS

提供并發控制功能以正確的方式高度并發事務,避免

并發事務之間的相互干擾造成數據的不一致性,保證

數據庫的完整性。

5.3.4封鎖及其產生問題的解決

實現并發控制的方法主要有兩種:封鎖(Lock)

技術和時標(Timestamping)技術。這里只介紹封鎖

技術。

1、封鎖類型(LockType)

所謂封鎖就是當一個事務在對某個數據對象(可

以是數據項、記錄、數據集、以至整個數據庫)進行

操作之前,必須獲得相應的鎖,以保證數據操作的正

確性和一致性。

封鎖是目前DBMS普遍采用的并發控制方法,基本

的封鎖類型有兩種:排它鎖和共享鎖。

5.3.4封鎖及其產生問題的解決

(1)排它鎖(ExclusiveLock)

排它鎖又稱寫鎖,簡稱為X鎖,其采用的原理是禁止

并發操作。當事務T對某個數據對象R實現X封鎖后,其他

事務要等T解除X封鎖以后,才能對R進行封鎖。這就保證

了其他事務在T釋放R上的鎖之前,不能再對R進行操作。

(2)共享鎖(ShareLock)

共享鎖又稱讀鎖,,簡稱為S鎖,其采用的原理是允

許其他用戶對同一數據對象進行查詢,但不能對該數據

對象進行修改。當事務T對某個數據對象R實現S封鎖后,

其他事務只能對R加S鎖,而不能加X鎖,直至UT釋放R上的

S鎖。這就保證了其他事務在T釋放R上的S鎖之前,只能

讀取R,而不能再對R作任何修改。

5.3.4封鎖及其產生問題的解決

2、封鎖協議(LockProtocol)

封鎖可以保證合理的進行并發控制,保證數據的一

致性。

實際上,鎖是一個控制塊,其中包括被加鎖記錄

的標識符及持有鎖的事務的標識符等。在封鎖時,要

考慮一定的封鎖規則,例如,何時開始封鎖、封鎖多

長時間、何時釋放等,這些封鎖規則稱為封鎖協議。對

封鎖方式規定不同的規則,就形成了各種不同的封鎖

協議。

封鎖協議在不同程序上對正確控制并發操作提供了

一定的除征。

5.3.4封鎖及其產生問題的解決

上面講述過的并發操作所帶來的丟失更新、污讀和不可重讀等數據

不一致性問題,可以通過三級封鎖協議在不同程度上給予解決,下面介

紹三級封鎖協議。

1、一級封鎖協議

一級封鎖協議的內容是:事務T在修改數據對象之前必須對其加X鎖,

直到事務結束。

具體地說,就是任何企圖更新記錄R的事務必須先執行“XLOCKR”

操作,以獲得對該記錄進行更新的能力并對它取得X封鎖。如果未獲準

“X封鎖”,那么這個事務進入等待狀態,一直到獲準“X封鎖”,該

事務才繼續做下去。

該事務規定事務在更新記錄R時必須獲得排它性封鎖,使得兩個同

時要求更新R的并行事務之一必須在一個事務更新操作執行完成之后才

能獲得X封鎖,這樣就避免了兩個事務讀到同一個R值而先后更新時所

份力的壬失事新向顆._________

5.3.4封鎖及其產生問題的解決

利用一級封鎖協議可以解決表5.5中的數據丟失更

新問題,如表5.8所示。

事務T1先對R進行X封鎖(XLOCK),事務T2執行

“XLOCKR”操作,未獲準“X封鎖”,則進入等待狀態,

直到事務T1更新R值以后,解除X封鎖操作(UNLOCKX)。

此后事務T2再執行“XLOCKR”操作,獲準“X封鎖”,

并對R值進行更新(此時R已是事務T1更新過的值,

R=900)o

這樣就能得出正確的結果。

一級封鎖協議只有當修改數據時才進行加鎖,如

果只是讀取數據并不加鎖,所以它不能防止“污讀”和

“重讀”數據。

5.3.4封鎖及其產生問題的解決

表5.8無丟失更新問題

時間事務T1R的值事務T2

XLOCKR1000

t1FINDR

t2XLOCKR

R=R-200WAIT

t4UPDATERWAIT

t5UNLOCKX800WAIT

t6XLOCKR

t7R=R-300

t8UPDATER

t9500UNLOCKX

5.3.4封鎖及其產生問題的解決

2、二級封鎖協議

二級封鎖協議的內容是:在一級封鎖協議的基礎上,

另外加上事務T在讀取數據R之前必須先對其加S鎖,讀

完后釋放S鎖。

所以二級封鎖協議不但可以解決更新時所發生的數

據丟失問題,還可以進一步防止“污讀”。

5.3.4封鎖及其產生問題的解決

利用二級封鎖協議可以解決表5.6中的數據“污讀”問題,

如表5.9所示。

事務T1先對R進行X封鎖表5.9無污讀問題

(XLOCK),把R的值改為時間事務T1R的值事務T2

800,但尚未提交。這時事務toXLOCKR1000

T2請求對數據R加S鎖,因為t1FINDR

T1已對R力口了X鎖,T2只能等t2R=R-200

待,直到事務T1釋放X鎖。之t3UPDATER

后事務T1因某種原因撤銷,t4800SLOCKR

數據R恢復原值1000,并釋放t5ROLLBACKWAIT

R上的X鎖。事務T2可對數據t6UNLOCKR1000SLOCKR

R加S鎖,讀取R=1000,得到

t71000FINDR

了正確的結果,從而避免了事

t8UNLOCKS

務T2讀取“臟數據”。

5.3.4封鎖及其產生問題的解決

3、三級封鎖協議

三級封鎖協議的內容是:在一級封鎖協議的基礎

上,另外加上事務T在讀取數據R之前必須先對其加S鎖,

讀完后并不釋放S鎖,而直到事務T結束才釋放。

所以三級封鎖協議除了可以防止更新丟失問題和

“污讀”數據外,還可進一步防止不可重讀數據,徹

底解決了并發操作所帶來的三個不一致性問題。

利用三級封鎖協議可以解決表5.7中的不可重讀問題。

5.3.4封鎖及其產生問題的解決

、封鎖粒度(LockGranularity)

封鎖對象的大小稱為封鎖粒度。根據對數據的不同處理,

封鎖的對象可以是這樣一些邏輯單元:字段、數據庫等,也

可以是這樣一些物理單元:頁(數據頁或索引頁)、塊等。

封鎖粒度與系統的并發度和并發控制的開銷密切相關。

封鎖粒度越小,系統中能夠被封鎖的對象就越多,并發

度越高,但封鎖機構復雜,系統開銷也就越大。封鎖粒度越

大,系統中能夠被封鎖的對象就越少,并發度越小,封鎖機

構簡單,相應系統開銷也就越小。

因此,在實際應用中,選擇封鎖粒度時應同時考慮封鎖

機制和并發度兩個因素,對系統開銷與并發度進行權衡,以

5.3.4封鎖及其產生問題的解決

4、死鎖和活鎖

封鎖技術可有效解決并行操作引起的數據不一致性問題,但也

可產生新的問題,即可能產生活鎖和死鎖問題。

1、活鎖(Livelock)

當某個事務請求對某一數據的排它性封鎖時,由于其他事

務一直優先得到對該數據的封鎖與操作而使這個事務一直處于

等待狀態,這種狀態形成活鎖。

例如,事務T1在對數據R封鎖后,事務T2又請求封鎖R,于

是T2等待。T3也請求封鎖R。當T1釋放了R上的封鎖后,系統首

先批準了T3的請求,T2繼續等待。然后又有T4請求封鎖R,T3釋

放了R上的封鎖后,系統又批準了T4的請求…T2可能永遠處于等

待狀態,從而發生了活鎖。如表5.11所示。

5.3.4封鎖及其產生問題的解決

表5.11活鎖表5.12死鎖

時間事務T1事務T2事務T3事務T4時間事務T1事務T2

toLOCKR

toLOCKR1

t1...LOCKRt1LOCKR2

t2…WAITLOCKRt2

t3UNLOCKWAITWAITLOCKRt3LOCKR2

t4WAITLOCKRWAITt4WAIT

-

t5WAITWAITt5WAITLOCKR1

t6WAITUNLOCKWAIT

t6WAITWAIT

t7WAITLOCKRt7WAITWAIT

t8WAIT

5.3.4封鎖及其產生問題的解決

2、死鎖(Deadlock)

在同時處于等待狀態的兩個或多個事務中,每個事

務都在等待其中另一個事務解除封鎖,它才能繼續執

行下去,結果造成任何一個事務都無法繼續執行,這

種狀態稱為死鎖。

例如,事務T1在對數據R1封鎖后,又要求對數據R2

封鎖,而事務T2已獲得對數據R2的封鎖,又要求對數

據R1封鎖,這樣兩個事務由于都不能得到全部所需封

鎖而處于等待狀態,發生了死鎖。如表5.12所示。

5.3.4封鎖及其產生問題的解決

(1)死鎖產生的條件

發生死鎖的必要條件有以下四條:

①互斥條件:一個數據對象一次只能被一個事務所使用,

即對數據的封鎖采用排它式;

②不可搶占條件:一個數據對象只能被占有它的事務所

釋放,而不能被別的事務強行搶占;

③部分分配條件:一個事務已經封鎖分給它的數據對象,

但仍然要求封鎖其他數據;

④循環等待條件:允許等待其他事務釋放數據對象,系

統處于加鎖請求相互等待的狀態。

5.3.4封鎖及其產生問題的解決

(2)死鎖的預防

死鎖一旦發生,系統效率將會大大下降,因而要盡量避

免死鎖的發生。在操作系統的多道程序運行中,由于

多個進程的并行執行需要分別占用不同資源時,也會

發生死鎖。要想預防死鎖的產生,就得破壞形成死鎖

的條件。同操作系統預防死鎖的方法類似,在數據庫

環境下,常用的方法有以下兩種:

①一次加鎖法

5.3.4封鎖及其產生問題的解決

開始加I鎖

一次加鎖法是每個

事物必須將所有要使力門鎖第1個數據

用的數據對象全部依

次加鎖,并要求加鎖

成功,只要一個加鎖

加鎖第2個數據釋放所有己力II鎖的數據

不成功,表示本次加

鎖失敗,則應該立即

釋放所有已加鎖成功

的數據對象,然后重

新開始從頭加鎖。一

次加鎖法的程序框圖

如圖5.2。

圖5.2一次加鎖法

5.3.4封鎖及其產生問題的解決

一次加鎖法雖然可以有效地預防死鎖的發生,但也存在

一些問題。

首先,對某一事務所要使用的全部數據一次性加鎖,

擴大了封鎖的范圍,從而降低了系統的并發度。

其次,數據庫中的數據是不斷變化的,原來不要求

封鎖的數據,在執行過程中可能會變成封鎖對象,所

以很難事先精確地確定每個事務所要封鎖的數據對象,

這樣只能在開始擴大封鎖范圍,將可能要封鎖的數據

全部加鎖,這就進一步降低了并發度,影響了系統的

運行效率。

5.3.4封鎖及其產生問題的解決

②順序加鎖法

順序加鎖法是預先對所有可加鎖的數據對象規定

一個加鎖順序,每個事務都需要按此順序加鎖,在釋

放時,按逆序進行。

順序加鎖法同一次加鎖法一樣,也存在一些問題。

因為事務的封鎖請求可以隨著事務的執行而動態地決

定,所以很難事先確定封鎖對象,從而更難確定封鎖

順序。即使確定了封鎖順序,隨著數據操作的不斷變

化,維護這些數據的封鎖順序要需要很大的系統開銷。

5.3.4封鎖及其產生問題的解決

在數據庫系統中,由于可加鎖的目標集合不但很大,

而且是動態變化的;可加鎖的目標常常不是按名尋址,

而是按內容尋址,預防死鎖常要付出很高的代價,因

而上述兩種在操作系統中廣泛使用的預防死鎖的方法

并不很適合數據庫的特點。

在數據庫系統中,還有一種解決死鎖的辦法,即可

以允許發生死鎖,但在死鎖發生后可以由系統及時自

動診斷并解除已發生的死鎖,從而避免事務自身不可

解決的資源爭用問題。

5.3.4封鎖及其產生問題的解決

(3)死鎖的診斷與解除

數據庫系統中診斷死鎖的方法與操作系統類似。可

以利用事務信賴圖的形式來測試系統中是否存在死鎖。

例如在圖5.3中,事務T1需要數據R,但R已經被事務T2

封鎖,那么從T1到T2劃一個箭頭。如果在事務依賴圖

中沿著箭頭方向存在一個循環,那么死鎖的條件就形

成了,系統就會出現死鎖。

圖5.3事務依賴圖

首頁I上一頁I下一頁?尾頁?結束?返回?謁音

5.3.4封鎖及其產生問題的解決

如果已經發現死鎖,DBA從依賴相同資源的事務中

抽出某個事務作為犧牲品,將它撤銷,并釋放此事務

占用的所有數據資源,分配給其他事務,使其他事務

得以繼續運行下去,這樣就有可能消除死鎖。

在解除死鎖的過程中,抽取犧牲事務的標準是根據

系統狀態及其應用的實際情況來確定的,通常采用的

方法之一是選擇一個處理死鎖代價最小的事務,將其

撤銷;或從用戶等級角度考慮,取消等級低的用戶事

務,釋放其封鎖的資源給其它需要的事務。

5.3.5SQLServer2000的并發控制機制

SQLServer2000使用加鎖技術確保事務完整性和

數據庫一致性。鎖定可以防止用戶讀取正在由其他用

戶更改的數據,并可以防止多個用戶同時更改相同數

據。雖然SQLServer2000自動強制鎖定,但可以通

過了解鎖定并在應用程序中自定義鎖定來設計更有效

的并發控制應用程序。

SQLServer2000提供如下八種鎖類型:共享(S)、更

新(U)、排它(X)、意向共享(IS)、意向排它(IX)、與意

向排它共享(SIX)、架構(Sch)、大容量更新(BU),只有

兼容的鎖類型才可以放置在已鎖定的資源上。

5.3.5SQLServer2000的并發控制機制

SQLServer使用的主要鎖類型描述如下:

①共享(S):用于不更改或不更新數據的操作(只讀操作

如select語句)。資源上存在共享鎖時,任何其它事務

都不能修改數據;

②更新(U):用于可更新的資源中。一次只有一個事務可

以獲得資源的更新鎖。如果事務修改資源,則更新鎖

轉換為排它(X)鎖。否則鎖轉換為共享鎖。防止當多個

會話在讀取、鎖定以及隨后可能進行的資源更新時發

生死鎖;

5.3.5SQLServer2000的并發控制機制

③排它(X):用于數據修改操作例如insert、update或delete。

加排它鎖后其它事務不能讀取或修改排它鎖鎖定的數

據。確保不會同時對同一資源進行多重更新;

④意向⑴:用于建立鎖的層次結構。

意向鎖又細分為:意向共享(IS)、意向排它(IX)以及與

意向排它共享(SIX)。

5.3.5SQLServer2000的并發控制機制

在transact-sql語句使用中有如下缺省加鎖規則:

select查詢缺省時請求獲得共享鎖(頁級或表級);

insert語句總是請求獨占的頁級鎖;

update和delete查詢通常獲得某種類型的獨占鎖

以進行數據修改;如果當前將被修改的頁上存在讀鎖,

則delete或update語句首先會得到修改鎖,當讀過程

結束以后,修改鎖自動改變為獨占鎖。

5.3.5SQLServer2000的并發控制機制

可以使用select、insert、update和delete語句

指定表級鎖定提示的范圍,以引導SQLServer2000使

用所需的鎖類型。當需要對對象所獲得鎖類型進行更

精細控制時,可以使用手工鎖定提示如:holdlock.

nolock>paglock>readpast>rowlock>tablock、

tablockx>updlock>xlock等,這些鎖定提示取代了

會話的當前事務隔離級別指定的鎖。

例如查詢時,可強制設定加獨占鎖,命令為:

selectsnofromstudentwith(tablockx)wheredept='CS'

5.3.5SQLServer2000的并發控制機制

SQLServer2000具有多粒度鎖定能力,允許一

個事務鎖定不同類型的資源。為了使鎖定的成本減至

最少,SQLServer2000自動將資源鎖定在適合任務的

級別。鎖定在較小的粒度(例如行)可以增加并發但需

要較大的開銷,因為如果鎖定了許多行,則需要控制

更多的鎖。鎖定在較大的粒度(例如表)就并發而言是

相當昂貴的,因為鎖定整個表限制了其它事務對表中

任意部分進行訪問,但要求的開銷較低,因為需要維

護的鎖較少。

5.3.5SQLServer2000的并發控制機制

SQLServer2000可以鎖定以下資源,見表5.13。

表5.13資源加鎖粒度表

資源描述

RID行標識符。用于單獨鎖定表中的一行。

鍵索引中的行鎖。用于保護可串行事務中的鍵范圍。

頁8千字節(KB)的數據頁或索引頁。

擴展盤區相鄰的八個數據頁或索引頁構成的一組。

表包括所有數據和索引在內的整個表。

DB數據庫。

5.3.5SQLServer2000的并發控制機制

事務準備接受不一致數據的級別稱為隔離級別。

隔離級別是一個事務必須與其它事務進行隔離的程度。

較低的隔離級別可以增加并發,但代價是降低數據的

正確性。相反,較高的隔離級別可以確保數據的正確

性,但可能對并發產生負面影響。應用程序要求的隔

離級別確定了SQLServer2000使用的鎖定行為。

如:settransactionisolationlevel

repeatableread--設置為可重復讀

5.3.5SQLServer2000的并發控制機制

SQL?定義了下列四種隔離級別,如下由低到高

的四種隔離級別:readuncommitted、read

committed、repeatableread>serializable,默認

情況下,SQLServer情00在readcommitted隔離級別

上操作。但是應用程序可能必須運行于不同的隔離級

別。若要在應用程序中使用更嚴格或較寬松的隔離級

別,可以使用Transact-SQL或通過數據庫API來設置事

務隔離級別,來自定義整個會話的鎖定。

如:settransactionisolationlevelrepeatableread一

設置為可重復讀

5.3.5SQLServer2000的并發控制機制

隔離級別含義如下:一

①readuncommitted:執行臟讀或0級隔離鎖定,這表

示事務中不發出共享鎖,也不接受排它鎖。當設置該

選項時,可以對數據執行未提交讀或臟讀;在事務結

束前可以更改數據內的數值,行也可以出現在數據集

中或從數據集消失。該選項的作用與在事務內所有語

句中的所有表上設置nolock相同。這是四個隔離級別中

限制最小的級別。

②readcommitted:指定在讀取數據時控制共享鎖以避

免臟讀,但數據可在事務結束前更改,從而產生不可

重復讀取或幻影數據。該選項是SQLServer的默認值。

5.3.5SQLServer2000的并發控制機制

③repeatableread:鎖定查詢中使用的所有數據以防止

其他用戶更新數據,但是其他用戶可以將新的幻影行

插入數據集,且幻影行包括在當前事務的后續讀取中。

④serializable:在數據集上放置一個范圍鎖,以防止

其他用戶在事務完成之前更新數據集或將行插入數據

集內。這是四個隔離級別中限制最大的級別。因為并

發級別較低,所以應只在必要時才使用該選項。該選

項的作用與在事務內所有select語句中的所有表上設置

holdlock相同o

5.3.5

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論