需求分析與系統(tǒng)設(shè)計(jì)_第1頁(yè)
需求分析與系統(tǒng)設(shè)計(jì)_第2頁(yè)
需求分析與系統(tǒng)設(shè)計(jì)_第3頁(yè)
需求分析與系統(tǒng)設(shè)計(jì)_第4頁(yè)
需求分析與系統(tǒng)設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩150頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、需求分析與系統(tǒng)設(shè)計(jì) 第9章 程序和事務(wù)設(shè)計(jì) 我們區(qū)分系統(tǒng)設(shè)計(jì)和程序設(shè)計(jì)。程序設(shè)計(jì)是系統(tǒng)設(shè)計(jì)中模擬程序的執(zhí)行邏輯,定義客戶機(jī)服務(wù)器對(duì)象合作的框架的那個(gè)部分。IS程序執(zhí)行業(yè)務(wù)事務(wù)。假設(shè)一個(gè)事務(wù)的范圍定義在程序之內(nèi)的話,它就是DBMS可以維持的數(shù)據(jù)庫(kù)一致性的一個(gè)單元。 第9章 程序和事務(wù)設(shè)計(jì) 程序和事務(wù)設(shè)計(jì)將系統(tǒng)設(shè)計(jì)制品放在一起,并作為系統(tǒng)設(shè)計(jì)過(guò)程的最終階段。它將應(yīng)用邏輯賦給GUI和數(shù)據(jù)庫(kù)設(shè)計(jì)。它的結(jié)果是給程序員提供足夠的程序設(shè)計(jì)指令,使他們能開(kāi)始“裁剪代碼”的設(shè)計(jì)文檔。事實(shí)上,一些初步的代碼可以從設(shè)計(jì)中自動(dòng)生成(前向工程)。程序員對(duì)初始代碼的擴(kuò)展。可以逆向回溯到設(shè)計(jì)階段,從而得到一個(gè)“雙向”工程的

2、周期。 第9章 程序和事務(wù)設(shè)計(jì) 9.1設(shè)計(jì)程序 9.2程序?qū)Ш?9.3設(shè)計(jì)事務(wù) 9.4雙向工程 9.1設(shè)計(jì)程序 程序設(shè)計(jì)是完整的系統(tǒng)設(shè)計(jì)(第6章、7章和第8章)的一個(gè)內(nèi)在部分。類(lèi)包和構(gòu)件的體系結(jié)構(gòu)設(shè)計(jì)建立通用的執(zhí)行框架。GUI和數(shù)據(jù)庫(kù)的詳細(xì)設(shè)計(jì)說(shuō)明這個(gè)框架的前端和后端。程序設(shè)計(jì)填充通用框架中間的空缺,并將它轉(zhuǎn)換為可以交給程序員去進(jìn)行開(kāi)發(fā)的設(shè)計(jì)文檔。 9.1設(shè)計(jì)程序 程序設(shè)計(jì)一次集中在一個(gè)應(yīng)用程序上。在這個(gè)意義上,程序設(shè)計(jì)是在第7章中討論的用戶界面設(shè)計(jì)的直接擴(kuò)展。程序設(shè)計(jì)使用數(shù)據(jù)庫(kù)設(shè)計(jì)的部分(子框架)(第8章),它還定義數(shù)據(jù)庫(kù)過(guò)程方向的內(nèi)容:存儲(chǔ)過(guò)程和專(zhuān)用程序觸發(fā)器。 9.1設(shè)計(jì)程序 程序的執(zhí)行

3、邏輯劃分為客戶機(jī)和服務(wù)器過(guò)程??蛻魴C(jī)過(guò)程具體化程序中大多數(shù)的動(dòng)態(tài)對(duì)象合作(6.2節(jié))。對(duì)象內(nèi)聚和耦合(9.1.1節(jié))的適當(dāng)?shù)钠胶饪梢砸种坪献鞯膹?fù)雜度。尤其是,服務(wù)器過(guò)程更注重執(zhí)好由客戶機(jī)過(guò)程啟動(dòng)的業(yè)務(wù)事務(wù)。 9.1設(shè)計(jì)程序9.1.1類(lèi)的內(nèi)聚和耦合 9.1.2設(shè)計(jì)客戶機(jī)服務(wù)器合作 9.1.1類(lèi)的內(nèi)聚和耦合 前面,特別是在第 5章和第 6章中,我們已經(jīng)給出了好的程序設(shè)計(jì)的主要原理,雖然那是在好的系統(tǒng)設(shè)計(jì)的意義下說(shuō)的。類(lèi)分層是寫(xiě)出可理解、可維護(hù)的以及可控規(guī)模程序的基礎(chǔ)。一旦將面向?qū)ο蟮某绦蚪唤o投入者,該程序便會(huì)變成遺產(chǎn)程序。正確地使用繼承和代理對(duì)避免這種情況是必需的。 9.1.1類(lèi)的內(nèi)聚和耦合 好的

4、程序設(shè)計(jì)要保證類(lèi)的內(nèi)聚和耦合的良好平衡。內(nèi)聚和耦合這兩個(gè)術(shù)語(yǔ)是由結(jié)構(gòu)化設(shè)計(jì)方法創(chuàng)造的。然而,這兩個(gè)術(shù)語(yǔ)在面向?qū)ο笤O(shè)計(jì)中具有相似的內(nèi)涵和重要性。 類(lèi)內(nèi)聚是類(lèi)的內(nèi)部自我確定的程度,它度量類(lèi)不與外界相關(guān)的強(qiáng)度。一個(gè)具有高內(nèi)聚的類(lèi)可以自己執(zhí)行一個(gè)行為,或者達(dá)到一個(gè)單一的目標(biāo)。內(nèi)聚越強(qiáng)越好。 9.1.1類(lèi)的內(nèi)聚和耦合 類(lèi)耦合是類(lèi)之間的關(guān)聯(lián)程度,它度量類(lèi)的相互關(guān)系。耦合越弱越好(然而,類(lèi)有時(shí)不得不“耦合”以便合作工作)。 內(nèi)聚和耦合相互是不一致的。好的內(nèi)聚意味著弱的耦合,反過(guò)來(lái)也一樣。設(shè)計(jì)者的任務(wù)是使這兩者之間達(dá)到一個(gè)最好的平衡。 9.1.1類(lèi)的內(nèi)聚和耦合 啟發(fā)式規(guī)則 :兩個(gè)類(lèi)應(yīng)該要么不依賴(lài)于另一個(gè),要么

5、一個(gè)類(lèi)應(yīng)該只依賴(lài)于另一個(gè)類(lèi)的公共接口。屬件和與之相關(guān)的方法應(yīng)該保存在同一個(gè)類(lèi)中(這個(gè)啟發(fā)式常常被其定義在公共接口許多存取者(get和set)方法所破壞)。一個(gè)類(lèi)應(yīng)該捕獲一個(gè)且只捕獲一個(gè)抽象。無(wú)關(guān)的信息,當(dāng)其方法的一個(gè)子集作用到屬性的一個(gè)真子集上,應(yīng)該移到另一個(gè)類(lèi)中。系統(tǒng)的智能應(yīng)該盡可能一致地分布(從而使得類(lèi)能夠一致地分擔(dān)同一項(xiàng)工作)。 9.1.1類(lèi)的內(nèi)聚和耦合 9.1.1.1類(lèi)耦合的種類(lèi) 9.1.1.2 Demeter法則 9.1.1.3存取程序方法和無(wú)智能類(lèi) 9.1.1.4動(dòng)態(tài)分類(lèi)和混合實(shí)例內(nèi)聚 9.1.1.1類(lèi)耦合的種類(lèi) 為了兩個(gè)類(lèi)之間能互相通信,它們需要被“耦合”。類(lèi)X和類(lèi)Y之間的耦合當(dāng)

6、類(lèi)X能夠直接涉及到類(lèi)Y時(shí)就存在了。八種類(lèi)的耦合: 1.X從Y繼承。 2.X具有類(lèi)Y的屬性。 3.X具有帶上類(lèi)Y作為參數(shù)的模板屬性。 4.X具有將類(lèi)Y作為輸入?yún)?shù)的方法。 5.X具有將類(lèi)Y作為輸出參數(shù)的方法。 6.X知道類(lèi)Y的全局變量。 7.X知道包含類(lèi)Y的局部變量的方法。 8.X是Y的一個(gè)友元。9.1.1.2 Demeter法則 類(lèi)耦合對(duì)對(duì)象通信是必需的,但是它應(yīng)該盡可能被限制在類(lèi)層的范圍之內(nèi)(即限制為層內(nèi)的耦合)。層之間的耦合應(yīng)該降到最低。在Demeter法則中給出了對(duì)限制類(lèi)之間的任意通信的另一個(gè)方針,它說(shuō)消息的目標(biāo)只能是下面給出的對(duì)象:1.方法的對(duì)象本身。2.方法型構(gòu)中的作為參數(shù)的對(duì)象。3

7、.由對(duì)象的屬性所指的對(duì)象(包括在屬性的集合中索引到的對(duì)象)。4.由該方法創(chuàng)建的對(duì)象。5.由全局變量代表的對(duì)象。 為了限制由繼承引起的耦合,第三個(gè)規(guī)則可以局限于類(lèi)本身定義的屬性。被類(lèi)繼承的屬性不能用來(lái)代表一個(gè)消息的目標(biāo)對(duì)象。這個(gè)限制被認(rèn)為是強(qiáng)Demeter法則。 9.1.1.3存取程序方法和無(wú)智能類(lèi) 像在9.1.1節(jié)中所提到的那樣,屬性及其相關(guān)的方法應(yīng)該保存在一個(gè)類(lèi)中。一個(gè)類(lèi)應(yīng)該決定它自己的命運(yùn),一個(gè)類(lèi)可以用將存取程序方法局限在它自己接口中的方法來(lái)限制其他類(lèi)存取自己的狀態(tài)。存取程序方法定義觀察器(get)或變異器(set)操作(8.3.1.2節(jié))。 9.1.1.3存取程序方法和無(wú)智能類(lèi) 存取程序

8、方法將一個(gè)類(lèi)“開(kāi)放”,并由其他類(lèi)來(lái)進(jìn)行內(nèi)部操作。雖然耦合蘊(yùn)涵一定程度的開(kāi)發(fā),但過(guò)多地使用存取程序方法可能導(dǎo)致智能在類(lèi)之間的不平衡分布。一個(gè)帶有許多存取程序方法的類(lèi)有變?yōu)闊o(wú)智能類(lèi)的危險(xiǎn),其他的類(lèi)決定什么對(duì)它來(lái)說(shuō)是好的。 這就是說(shuō),存在這樣的情況,一個(gè)類(lèi)不得不對(duì)其他類(lèi)開(kāi)放。當(dāng)存在實(shí)現(xiàn)兩個(gè)或多個(gè)類(lèi)之間的一種策略時(shí),這種情況就會(huì)出現(xiàn)。這樣的例子有很多。 9.1.1.3存取程序方法和無(wú)智能類(lèi) 假設(shè)我們有兩個(gè)類(lèi)INTEGER和REAL,我們需要實(shí)現(xiàn)一個(gè)整數(shù)和實(shí)數(shù)之間進(jìn)行轉(zhuǎn)換的“策略”,那么這個(gè)策略應(yīng)該在其中哪個(gè)類(lèi)中實(shí)現(xiàn)呢?或者我們需要一個(gè)CONVERTER類(lèi)來(lái)實(shí)現(xiàn)這個(gè)策略?采取任何一種方式,都至少有其中的

9、一個(gè)類(lèi)必須允許存取程序方法,而且對(duì)這個(gè)策略而言它將變成是“無(wú)智能”。 9.1.1.3存取程序方法和無(wú)智能類(lèi) 一個(gè)出自Jones的著名引證在這里是恰當(dāng)?shù)模骸霸谝粋€(gè)面向?qū)ο蟮霓r(nóng)場(chǎng),有面向?qū)ο蟮呐D?。?yīng)該是面向?qū)ο蟮呐0l(fā)送給面向?qū)ο蟮呐D蘵ncow_ yourself消息,還是面向?qū)ο蟮呐D贪l(fā)送給自向?qū)ο蟮呐nmilk_yourself消息?” 。 例9.1(大學(xué)注冊(cè)) 在第6章,我們已經(jīng)為大學(xué)注冊(cè)的部分需求設(shè)計(jì)了其中的合作部分。這個(gè)合作模型提供了相對(duì)統(tǒng)一的智能的分布,但是沒(méi)有討論其他的解決方案。 對(duì)這個(gè)例子,假設(shè)需要對(duì)一個(gè)課程增加一個(gè)學(xué)生。為此,需要做兩個(gè)檢查。第一,必須找出學(xué)習(xí)這個(gè)課程的前提條

10、件。第二,必須檢查學(xué)生的學(xué)業(yè)記錄以確定這個(gè)學(xué)生是否滿足這個(gè)前提條件。有了這些信息,我們才可以決定這個(gè)學(xué)生是否能夠增加到這個(gè)課程的學(xué)習(xí)中。 考慮由邊界對(duì)象:EnrolmentWindow發(fā)送的消息enrol(),考慮三個(gè)類(lèi):CourseOffering、Course和Student來(lái)合作完成這個(gè)任務(wù)。我們的工作是設(shè)計(jì)一組可能的協(xié)作圖來(lái)解決這個(gè)問(wèn)題。討論不同方案的利弊。 例9.1(大學(xué)注冊(cè)) 圖9.1說(shuō)明了第一種方案。邊界對(duì)象:Enrolmentwindow通過(guò)發(fā)送enrol()消息給aCourse.aCourse請(qǐng)求aStudent的學(xué)習(xí)記錄,并對(duì)照它的前提條件進(jìn)行檢查來(lái)啟動(dòng)這個(gè)事務(wù)。aCour

11、se決定aStudent是否可以被汪冊(cè),并請(qǐng)求aCourseOffering增加aStudent到它的學(xué)生表中。 例9.1(大學(xué)注冊(cè)) 圖9-1中的情景賦予對(duì)象aCourse太大的能力。aCourse是策略的制定者,aStudent是個(gè)無(wú)智能類(lèi)。這個(gè)方案是不平衡的但又沒(méi)達(dá)到平衡的辦法。 例9.1(大學(xué)注冊(cè))例9.1(大學(xué)注冊(cè)) 我們可以將重心從aCourse轉(zhuǎn)移到astudent,從而獲得了圖9-2所示的方案?,F(xiàn)在,:EnrolmentWindow要求astudent做重要的工作。aStudent調(diào)用aCourse中的一個(gè)觀察者方法getPrereq()。aStudent決定這次注冊(cè)是否可能,

12、并命令aCourseOffering給這個(gè)學(xué)生注冊(cè)。圖9-3說(shuō)明了一個(gè)較為平衡的解決方案,其中aCourseOffering是策略制定者。這個(gè)方案對(duì)aCourse和aStudent是公平的,但它卻使這兩個(gè)對(duì)象相當(dāng)空閑和不用思考。ACourseOffering就像是“主程序”(Riel的說(shuō)法中的一個(gè)“上帝”類(lèi)。 例9.1(大學(xué)注冊(cè))例9.1(大學(xué)注冊(cè))例9.1(大學(xué)注冊(cè)) 圖9-3的方案可以得到改進(jìn),即引入一個(gè)控制對(duì)象來(lái)處理策略信息(參見(jiàn)BCE方法,5.2.4節(jié))。圖9-4中的控制對(duì)象:EnrolmentPolicy將這三個(gè)實(shí)體對(duì)象從注冊(cè)策略中解放出來(lái)。這是有益的,因?yàn)樽?cè)策略的任何變化都封裝在

13、這個(gè)單獨(dú)的控制類(lèi)中。然而,類(lèi)EnrolmentPolicy也有變?yōu)椤吧系邸鳖?lèi)的危險(xiǎn)。 例9.1(大學(xué)注冊(cè))9.1.1.4動(dòng)態(tài)分類(lèi)和混合實(shí)例內(nèi)聚 在第2.1.5.2.3節(jié)中,我們提出了動(dòng)態(tài)分類(lèi)的問(wèn)題,并且觀察到流行的面向?qū)ο蟪绦蛟O(shè)計(jì)環(huán)境并不支持它。缺乏這個(gè)支持的代價(jià)常常反映在設(shè)計(jì)出具有混合實(shí)例內(nèi)聚的類(lèi)。 Jones定義“一個(gè)具有混合實(shí)例內(nèi)聚的類(lèi)有某些對(duì)該類(lèi)的一些對(duì)象來(lái)說(shuō)沒(méi)有定義的性質(zhì)?!边@種類(lèi)的一些方法只能作用到其對(duì)象的一個(gè)子集上,一些屬件只對(duì)對(duì)象的子集有意義。9.1.1.4動(dòng)態(tài)分類(lèi)和混合實(shí)例內(nèi)聚 例如,類(lèi)Employee可能定義了一些對(duì)象,他們可以是“一般的”雇員也可以是經(jīng)理。經(jīng)理是付年薪的,

14、然而向一個(gè)Employee對(duì)象發(fā)送PayAllowance的消息是沒(méi)有意義的,因?yàn)榭赡苓@個(gè)Employee對(duì)象井不是經(jīng)理。 9.1.1.4動(dòng)態(tài)分類(lèi)和混合實(shí)例內(nèi)聚 為了消除這種混合實(shí)例內(nèi)聚,需要擴(kuò)展泛化層次來(lái)標(biāo)識(shí)Employee的子類(lèi),如Ordinary mployee和Manager。然而,Employee對(duì)象可能今天是OrdinaryEmployee,明天就成為Manager,或者反之亦然。為了消除混合實(shí)例內(nèi)聚,需要允許對(duì)象能在運(yùn)行時(shí)動(dòng)態(tài)地改變它所屬的類(lèi)公認(rèn)的catch-22,如果不支持動(dòng)態(tài)分類(lèi)的話。 例9.2(大學(xué)注冊(cè)) 考慮下面對(duì)例9.1的變化:晚上的課程只向非全日制學(xué)生提供。全日制學(xué)生

15、只可以注冊(cè)白天的課程。如果非全日制學(xué)生要注冊(cè)晚上的課程的話,要付少量的費(fèi)用。非全日制學(xué)生當(dāng)在一個(gè)給定的學(xué)期中注冊(cè)了多于六個(gè)信用點(diǎn)(即一般要多于兩個(gè)課程)時(shí),自動(dòng)考慮為是全日制的。 我們的任務(wù)是提出一個(gè)不帶混合實(shí)例內(nèi)聚的高內(nèi)聚結(jié)構(gòu)合作模型,然后仔細(xì)地評(píng)價(jià)這個(gè)模型,并提出和討論另一個(gè)能避免動(dòng)態(tài)分類(lèi)問(wèn)題的方案。 例9.2(大學(xué)注冊(cè)) 為了消除混合實(shí)例內(nèi)聚,需要將Student特化為兩個(gè)子類(lèi)PartTimeStudent和FullTimeStudent(圖9-5),如果每個(gè)學(xué)生必須要么是非全日制的要么是全日制的話,類(lèi)Student就是抽象的。消息payExtraFee(crs_off)將不會(huì)發(fā)送給類(lèi)F

16、ullTimeStudent的對(duì)象,因?yàn)镕ullTimeStudent沒(méi)有這樣的方法。 例9.2(大學(xué)注冊(cè)) 必須承認(rèn),這樣仍然存在問(wèn)題。一個(gè)非全日制的學(xué)生可能對(duì)白大的課程有偏愛(ài)(即evening_preference=False)并且沒(méi)有額外要付的費(fèi)用。換句話說(shuō),在 PartTimeStudent中仍有混合實(shí)例內(nèi)聚問(wèn)題。如果學(xué)生選擇了白天的課程的話,向PartTimeStudent發(fā)送消息payExtraFee(crs_off)將沒(méi)有意義。 例9.2(大學(xué)注冊(cè)) 例9.2(大學(xué)注冊(cè)) 圖9-6擴(kuò)展了這個(gè)設(shè)計(jì)來(lái)消除另一方面的混合實(shí)例內(nèi)聚。類(lèi)DayPrefPartTimeStudent沒(méi)有方法p

17、ayExtraFee(crs_off) 。但是如果DayPrefPartTimeStudent因?yàn)榘滋斓恼n程的沒(méi)有更多的名額而不得不選擇晚上的課程,又會(huì)怎么樣呢?也許,要付某種其他的費(fèi)用。應(yīng)該再進(jìn)一步特化從而導(dǎo)出類(lèi)UnluckyDayPrefPartTimeStudent嗎? 例9.2(大學(xué)注冊(cè)) 例9.2(大學(xué)注冊(cè)) 若不想進(jìn)入一個(gè)荒謬的情景的話,我們可以選擇放棄進(jìn)一步推進(jìn)消除混合實(shí)例內(nèi)聚的想法。這里我們還沒(méi)有提到動(dòng)態(tài)分類(lèi),但實(shí)際上,屬性current_sem_credit_points的當(dāng)前值決定了一個(gè)學(xué)生是非全日制的還是全日制的。 例9.2(大學(xué)注冊(cè)) 同樣,一個(gè)學(xué)生在任何時(shí)候都可以改變

18、他對(duì)晚上還是白天的課程的偏好。如果缺少程序設(shè)計(jì)環(huán)境對(duì)動(dòng)態(tài)分類(lèi)的支持,那就是程序員的責(zé)任來(lái)讓一個(gè)對(duì)象在運(yùn)行過(guò)程中改變它所屬的類(lèi)。這是很困難的在永久對(duì)象的情況下,其對(duì)象OID值包含了類(lèi)標(biāo)識(shí)符時(shí)尤其困難。 例9.2(大學(xué)注冊(cè)) 另一種方法就是限制繼承層次的深度,消除對(duì)動(dòng)態(tài)分類(lèi)的要求,并重新引入一定數(shù)量的混合實(shí)例內(nèi)聚。例如,我們可以允許一個(gè)對(duì)象根據(jù)屬性evening_preference的不同取值用不同的方式去響應(yīng)消息payExtraFee(crs_off),從而能夠依靠圖 9-5中的結(jié)構(gòu)化合作,并解決含偏好晚上課程的問(wèn)題。 例9.2(大學(xué)注冊(cè)) 可以用一個(gè)if語(yǔ)句來(lái)編程,如下述偽代碼所示:metho

19、d payExtraFee(crs_off) for the class PartTimeStudentif evenig_preference=False returnelsedo itend method 例9.2(大學(xué)注冊(cè)) 雖然在面向?qū)ο蟠a中使用if語(yǔ)句表明了放棄繼承和多態(tài)性,但從純粹實(shí)際的原因來(lái)看它是不可避免的。與其費(fèi)力地解決動(dòng)態(tài)分類(lèi)的問(wèn)題,不如程序員給類(lèi)引入了動(dòng)態(tài)語(yǔ)義。一個(gè)對(duì)象根據(jù)它當(dāng)前的局部狀態(tài)對(duì)相同的消息用不同的方式去響應(yīng)。狀態(tài)圖可以用來(lái)為這個(gè)類(lèi)設(shè)計(jì)動(dòng)態(tài)語(yǔ)義。不可否認(rèn)的是,這個(gè)過(guò)程將承受類(lèi)的內(nèi)聚問(wèn)題。 9.1.2設(shè)計(jì)客戶機(jī)服務(wù)器合作 IS程序?yàn)榱藬?shù)據(jù)與數(shù)據(jù)庫(kù)交互。客戶機(jī)程序必

20、須使用數(shù)據(jù)庫(kù)語(yǔ)言(通常是SQL)來(lái)存取和修改數(shù)據(jù)庫(kù)。為了理解一個(gè)客戶機(jī)程序如何與數(shù)據(jù)庫(kù)服務(wù)器通信,需要認(rèn)識(shí)到SQL可以用不同的形式出現(xiàn)并可以用于程序抽象的不同層次上。 9.1.2設(shè)計(jì)客戶機(jī)服務(wù)器合作 圖9-7區(qū)別了SQL接回的五個(gè)層次。在第一層,SQL用做DDL(數(shù)據(jù)定義語(yǔ)言)。DDL是一種規(guī)格說(shuō)明語(yǔ)言,用于定義數(shù)據(jù)庫(kù)的結(jié)構(gòu)(數(shù)據(jù)庫(kù)模式)。數(shù)據(jù)庫(kù)設(shè)計(jì)者和數(shù)據(jù)庫(kù)管理者(DBA)是第一層SQL的主要用戶。 9.1.2設(shè)計(jì)客戶機(jī)服務(wù)器合作 在第二層,SQL用做數(shù)據(jù)操縱語(yǔ)言(DML)或查詢語(yǔ)言。查詢語(yǔ)言這個(gè)術(shù)語(yǔ)有點(diǎn)用詞不當(dāng),因?yàn)榈诙由系腟QL不僅用來(lái)檢索數(shù)據(jù)用,還用來(lái)修改數(shù)據(jù)(帶有插入、修改和刪除操

21、作)。 9.1.2設(shè)計(jì)客戶機(jī)服務(wù)器合作 使用第二層SQL的用戶范圍很廣,從沒(méi)有經(jīng)驗(yàn)的專(zhuān)門(mén)用戶到有經(jīng)驗(yàn)的DBA。這一層上的SQL是交互式的,這意味著一個(gè)用戶可以在程序設(shè)計(jì)環(huán)境之外構(gòu)造一個(gè)查詢,并讓它立即在數(shù)據(jù)庫(kù)上運(yùn)行。第二層SQL是學(xué)習(xí)下面幾層更精化的SQL的一個(gè)切入點(diǎn)。 9.1.2設(shè)計(jì)客戶機(jī)服務(wù)器合作 應(yīng)用程序使用第二層以上的SQL。在這些更高的層次上,SQL允許第二層上(作為惟一選擇的)一次一個(gè)集合的處理機(jī)制仍然有效外,還允許一次一個(gè)記錄的處理機(jī)制。一次一個(gè)集合的處理取一個(gè)或多個(gè)表(記錄的集合)作為對(duì)一個(gè)查詢的輸入,并返回一個(gè)表作為輸出。雖然這是一個(gè)很強(qiáng)的機(jī)制,但在復(fù)雜查詢中使用卻是困難和危

22、險(xiǎn)的。 9.1.2設(shè)計(jì)客戶機(jī)服務(wù)器合作 為了能肯定一次查詢返回正確的結(jié)果,程序員必須有能力逐行瀏覽由查詢返回的記錄,并在一次一個(gè)記錄的基礎(chǔ)上決定對(duì)這些記錄要做什么。這樣的一次一個(gè)記錄的處理能力稱(chēng)為光標(biāo),并在第二層之上的SQL中有效。 9.1.2設(shè)計(jì)客戶機(jī)服務(wù)器合作 第三層上的SQL是嵌入在常規(guī)程序設(shè)計(jì)語(yǔ)言,如C和COBOL中的。因?yàn)槌绦蛟O(shè)計(jì)語(yǔ)言編譯器不理解SQL,需要一個(gè)預(yù)編譯器來(lái)將SQL語(yǔ)句翻譯成由DBMS供應(yīng)商提供的DB庫(kù)中的功能調(diào)用。程序員可以選擇直接使用DB庫(kù)函數(shù)來(lái)編程,在這種情況下就不需要預(yù)編譯器了。 9.1.2設(shè)計(jì)客戶機(jī)服務(wù)器合作 將客戶機(jī)程序與數(shù)據(jù)庫(kù)接口的一個(gè)流行方式是通過(guò)開(kāi)放數(shù)

23、據(jù)庫(kù)互連(ODBC)或Java數(shù)據(jù)庫(kù)互連(JDBC)標(biāo)準(zhǔn)。要用這種方式的編程,要求有對(duì)特定DBMS的ODBC或JDBC軟件驅(qū)動(dòng)程序。ODBC和JDBC在SQL之上提供一個(gè)標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)語(yǔ)言,它被這個(gè)驅(qū)動(dòng)程序翻譯成簡(jiǎn)單DBMS SQL。 9.1.2設(shè)計(jì)客戶機(jī)服務(wù)器合作 ODBCJDBC具有減輕本地DBMS SQL編程耦合度的優(yōu)點(diǎn)。如果程序需要將來(lái)移植到不同的目標(biāo)DBMS上,那么只要直接替換一下驅(qū)動(dòng)程序就可以了。更重要的是,用ODBCJDBC可以支持向多于一個(gè)DBMS發(fā)布詢問(wèn)的應(yīng)用。 9.1.2設(shè)計(jì)客戶機(jī)服務(wù)器合作 ODBCJDBC的缺點(diǎn)是:它具有SQL的“最低公共特性”,客戶機(jī)應(yīng)用不能利用任何特殊的

24、SQL特性或者由特定DBMS供應(yīng)商所支持的任何擴(kuò)展。 9.1.2設(shè)計(jì)客戶機(jī)服務(wù)器合作 第四層 SQL采用了與第三層 SQL同樣的策略,將 SQL嵌入在客戶機(jī)程序中。但第四層SQL提供更強(qiáng)的程序設(shè)計(jì),應(yīng)用生成器或第4GL(四代語(yǔ)言)。 4GL配置有“屏幕界面”和GUI構(gòu)建能力。由于IS應(yīng)用要求復(fù)雜的GUI,4GLSQL常常是構(gòu)建這種應(yīng)用的首選。 9.1.2設(shè)計(jì)客戶機(jī)服務(wù)器合作 第五層SQL補(bǔ)充了第三層和第四層,它提供將一些SQL語(yǔ)言從客戶機(jī)程序移向主動(dòng)(可編程)服務(wù)器數(shù)據(jù)庫(kù)的可能性。SQL用做程序設(shè)計(jì)語(yǔ)言(PLSQL)。服務(wù)器程序可以從客戶機(jī)程序內(nèi)進(jìn)行調(diào)用,就像在下面將要討論的那樣。 9.1.2

25、設(shè)計(jì)客戶機(jī)服務(wù)器合作9.1.2.1存儲(chǔ)過(guò)程 9.1.2.2觸發(fā)器 9.1.2.1存儲(chǔ)過(guò)程 Sybase RDBMS首先引入存儲(chǔ)過(guò)程,現(xiàn)在他們成為任何主要商用DBMS的一部分。存儲(chǔ)過(guò)程將數(shù)據(jù)庫(kù)變成一個(gè)主動(dòng)可編程系統(tǒng)。 9.1.2.1存儲(chǔ)過(guò)程 存儲(chǔ)過(guò)程是用擴(kuò)展的SQL編寫(xiě)的,它支持像變量、循環(huán)、分支和賦值這樣一些程序設(shè)計(jì)構(gòu)造元素。存儲(chǔ)過(guò)程還可以被命名,可以有輸入輸出參數(shù),它被編譯并存儲(chǔ)在數(shù)據(jù)庫(kù)中??蛻魴C(jī)程序調(diào)用一個(gè)存儲(chǔ)過(guò)程就跟它調(diào)用子過(guò)程一樣。 9.1.2.1存儲(chǔ)過(guò)程 圖9-8說(shuō)明了客戶機(jī)程序調(diào)用存儲(chǔ)過(guò)程與向服務(wù)器發(fā)送完整的查詢命令相比之下的優(yōu)點(diǎn)。在客戶機(jī)程序中構(gòu)成的查詢通過(guò)網(wǎng)絡(luò)發(fā)送給數(shù)據(jù)庫(kù)服務(wù)器

26、,這個(gè)查詢語(yǔ)句可能包含語(yǔ)法和其他錯(cuò)誤,但客戶機(jī)不能消除這些錯(cuò)誤,數(shù)據(jù)庫(kù)系統(tǒng)是惟一可以做這種驗(yàn)證的地方。一旦被驗(yàn)證,DBMS檢查調(diào)用者是否被授權(quán)運(yùn)行這個(gè)查詢。如果是,這個(gè)詢問(wèn)就被優(yōu)化以決定對(duì)所需數(shù)據(jù)的最好的訪問(wèn)規(guī)劃。只有這時(shí)它才能被編譯、執(zhí)行,最后將結(jié)果返回給客戶機(jī)。 9.1.2.1存儲(chǔ)過(guò)程 另一方面,如果詢問(wèn)(或者整個(gè)的詢問(wèn)的集合)被編寫(xiě)為存儲(chǔ)過(guò)程,則它被優(yōu)化并被編譯進(jìn)服務(wù)器數(shù)據(jù)庫(kù)。客戶機(jī)程序不需要在網(wǎng)絡(luò)上發(fā)送(可能是很大的)詢問(wèn)取而代之的是它只要發(fā)送對(duì)這個(gè)過(guò)程名的一個(gè)短調(diào)用和一組實(shí)參。如果幸運(yùn)的話,這個(gè)過(guò)程可能就駐留在DBMS內(nèi)存高速緩存中。如果不是,它將從數(shù)據(jù)庫(kù)中被調(diào)入內(nèi)存。 9.1.2.

27、1存儲(chǔ)過(guò)程 用戶的授權(quán)也要像對(duì)SQL詢問(wèn)一樣被檢查。然后實(shí)參代替形參并且存儲(chǔ)過(guò)程執(zhí)行,最后結(jié)果返回給調(diào)用者。 9.1.2.1存儲(chǔ)過(guò)程 就像在上述情景中看到的那樣,存儲(chǔ)過(guò)程提供了更有效的方式來(lái)從客戶機(jī)程序中訪問(wèn)數(shù)據(jù)庫(kù)。性能上的優(yōu)點(diǎn)是由于網(wǎng)絡(luò)堵塞的緩解,并且不需要每次收到客戶機(jī)請(qǐng)求時(shí)都進(jìn)行語(yǔ)法分析和編譯。甚至更重要的是,存儲(chǔ)過(guò)程由單獨(dú)的地方維護(hù),并可以供許多客戶機(jī)程序來(lái)調(diào)用。 9.1.2.2觸發(fā)器 觸發(fā)器(8.4.1.4節(jié))是一種特殊的存儲(chǔ)過(guò)程,它不能被調(diào)用他們?cè)谝粋€(gè)數(shù)據(jù)庫(kù)表上發(fā)生的插入、更新或刪除等事件時(shí)將他們自己觸發(fā)。這意味著每個(gè)數(shù)據(jù)庫(kù)表可以最多有三個(gè)觸發(fā)器。在某些系統(tǒng)中的確如此(如Sybas

28、e)。而在其他系統(tǒng)(如Oracle)中,因?yàn)榭梢詷?biāo)識(shí)出事件的其他變體,使得每個(gè)表可能有多于三個(gè)觸發(fā)器(雖然這樣,存在更多的觸發(fā)器并不意味著它的觸發(fā)器的表達(dá)能力就更強(qiáng))。 9.1.2.2觸發(fā)器 觸發(fā)器可以被編程以加進(jìn)作用在數(shù)據(jù)庫(kù)上并且不能被任何客戶機(jī)程序或者通過(guò)交互式SQLDML語(yǔ)句改變的任何業(yè)務(wù)規(guī)則。這意味著觸發(fā)器可以超出引用完整性約束的過(guò)程性強(qiáng)制手段(如在第8.4.1.4節(jié)中所討論的那樣)。例如,一個(gè)觸發(fā)器可以用來(lái)規(guī)定在某些時(shí)間段或某些天不允許訪問(wèn)數(shù)據(jù)庫(kù)。 9.1.2.2觸發(fā)器 客戶機(jī)程序的用戶甚至不會(huì)意識(shí)到觸發(fā)器正監(jiān)視著數(shù)據(jù)庫(kù)中什么正在被修改。如果這個(gè)修改不違反業(yè)務(wù)規(guī)則,觸發(fā)器對(duì)這個(gè)程序就

29、是不可見(jiàn)的。觸發(fā)器只有當(dāng)DML命令是不允許的時(shí)候才將自己暴露給用戶。觸發(fā)器將通知用戶所出現(xiàn)的問(wèn)題,它在程序屏幕上顯示出錯(cuò)信息并拒絕運(yùn)行這個(gè)DML操作。 9.2程序?qū)Ш?主動(dòng)數(shù)據(jù)庫(kù)出現(xiàn)了,程序設(shè)計(jì)對(duì)象的數(shù)量就增加了,并且對(duì)象合作也變得更復(fù)雜。作為程序員可以以此為起點(diǎn)考察實(shí)現(xiàn)工作的設(shè)計(jì)文檔的窗口導(dǎo)航圖(7.6.2節(jié))就顯得不夠了,它們需要擴(kuò)展為(代換為)更完整的程序?qū)Ш綀D。 9.2程序?qū)Ш?程序?qū)Ш綀D概念在UML中沒(méi)有標(biāo)準(zhǔn)化或者說(shuō)沒(méi)有討論。不過(guò)它是一種基本建模抽象,用來(lái)消除系統(tǒng)設(shè)計(jì)和系統(tǒng)實(shí)現(xiàn)之間的鴻溝。否則就是壞的軟件工程程序的體系結(jié)構(gòu)和邏輯沒(méi)有文檔化,而且留給程序員去決定。 9.2程序?qū)Ш?9.

30、2.1構(gòu)造型程序?qū)Ш降幕顒?dòng)圖9.2.2程序?qū)Ш綀D 9.2.1構(gòu)造型程序?qū)Ш降幕顒?dòng)圖 為了將窗口導(dǎo)航圖轉(zhuǎn)換為程序?qū)Ш綀D,需要對(duì)UML的活動(dòng)圖增加服務(wù)器端的構(gòu)造型。狀態(tài)(圓角長(zhǎng)方形)和活動(dòng)(橢圓)都應(yīng)該被構(gòu)造型。構(gòu)造型必須考慮DBMS模型或者甚至是特定DBMS的特性(這當(dāng)然是為什么UML中沒(méi)有提供這種導(dǎo)航圖的主要原因或借口)。 9.2.1構(gòu)造型程序?qū)Ш降幕顒?dòng)圖 下面的構(gòu)造型表可以用來(lái)用RDBMS設(shè)計(jì)程序?qū)Ш?。依?lài)于程序?qū)Ш綀D所處的抽象層次,這個(gè)表可以縮小,或者用另外的對(duì)象來(lái)擴(kuò)展:狀態(tài)(數(shù)據(jù)對(duì)象):活動(dòng)(程序?qū)ο螅嚎蛻魴C(jī)SQL查詢。9.2.1構(gòu)造型程序?qū)Ш降幕顒?dòng)圖 狀態(tài)(數(shù)據(jù)對(duì)象):數(shù)據(jù)庫(kù)。關(guān)系表

31、。列。記錄。關(guān)系視圖。列。記錄。索引。簇。9.2.1構(gòu)造型程序?qū)Ш降幕顒?dòng)圖 活動(dòng)(程序?qū)ο螅捍鎯?chǔ)過(guò)程。觸發(fā)器。對(duì)插入操作的。對(duì)更新操作的。對(duì)刪除操作的。其他種類(lèi)的觸發(fā)器。9.2.1構(gòu)造型程序?qū)Ш降幕顒?dòng)圖 客戶機(jī)SQL查詢。本地查詢。DB庫(kù)查詢。ODBCJDBC查詢。9.2.2程序?qū)Ш綀D 為了說(shuō)明程序?qū)Ш綀D,我們將簡(jiǎn)單地?cái)U(kuò)展在7.6.2節(jié)中給出的窗口導(dǎo)航圖。圖9-9就是擴(kuò)展(并進(jìn)行了細(xì)微的調(diào)整)圖7-23中的窗口導(dǎo)航圖后得到的程序?qū)Ш綀D。 程序?qū)Ш綀D 9.2.2程序?qū)Ш綀D 圖9-9引入了兩個(gè)服務(wù)器狀態(tài):Inventory Control()和Product(),增加了三個(gè)服務(wù)器活動(dòng):Selec

32、t Product()、 Update Product()和 On Update Product(),還增加了一個(gè)客戶機(jī)活動(dòng)Scroll()。 9.2.2程序?qū)Ш綀D 通過(guò)所增加的信息,圖9-9中的程序?qū)Ш綀D告訴程序員,要在Product Browser中顯示產(chǎn)品必須調(diào)用存儲(chǔ)過(guò)程(Select Product)。當(dāng)用戶上下滾動(dòng)瀏覽器窗口,這個(gè)窗口中的內(nèi)容必須從數(shù)據(jù)庫(kù)中更新時(shí),也調(diào)用相同的存儲(chǔ)過(guò)程。 9.2.2程序?qū)Ш綀D 在這個(gè)圖的下半部分,我們可以看到在 Update Product()中按下OK或Save鍵,就調(diào)用Update Product()。一個(gè)觸發(fā)器控制輸出的修改(On Update

33、Product)。 例9.3(關(guān)系管理) 考慮下述對(duì)例7.5(7.6.2節(jié))的擴(kuò)展:使用存儲(chǔ)過(guò)程來(lái)修改(插入、刪除、更新和完成)一個(gè)事件。需要有觸發(fā)器來(lái)監(jiān)控Event表上的插入和修改。 我們的任務(wù)是,為Contact Management應(yīng)用中處理事件修改這部分設(shè)計(jì)程序?qū)Ш綀D。 例9.3(關(guān)系管理) 這個(gè)例子的解決方案(圖9-10)只涉及來(lái)自圖7-24中與事件修改相關(guān)的那些客戶機(jī)狀態(tài)和活動(dòng)。注意,存儲(chǔ)過(guò)程Complete Event既可以從主窗口中也可以從對(duì)話框中調(diào)用。因?yàn)镃omplete Event要更新表Event,所以觸發(fā)器On Update Event啟動(dòng)。同樣的觸發(fā)器也可以被存儲(chǔ)過(guò)程

34、Save Event激活。 關(guān)系管理例9.3(關(guān)系管理) 對(duì)話框TaskEvent Details有雙重的作用,既用來(lái)插入新的事件,又用來(lái)更新存在的事件。命令鍵OK調(diào)用存儲(chǔ)過(guò)程Save Event。這個(gè)調(diào)用中的參數(shù)列表告訴這個(gè)過(guò)程O(píng)K是指插入還是指更新。對(duì)應(yīng)地,這個(gè)過(guò)程的執(zhí)行要啟動(dòng)兩個(gè)觸發(fā)器: On Insert Event或On Update Event中的一個(gè)。 9.3設(shè)計(jì)事務(wù) 事務(wù)是工作的一個(gè)邏輯單元,它包含一個(gè)或多個(gè)由用戶執(zhí)行的SQL語(yǔ)句。事務(wù)也是數(shù)據(jù)庫(kù)一致性的單元,數(shù)據(jù)庫(kù)的狀態(tài)在事務(wù)完成之后還是一致的。為了保證這個(gè)一致性,DBMS的事務(wù)管理有兩個(gè)作用:數(shù)據(jù)庫(kù)恢復(fù)和并發(fā)控制。 9.3設(shè)

35、計(jì)事務(wù) 按照SQL標(biāo)準(zhǔn),事務(wù)從第一個(gè)可執(zhí)行的SQL語(yǔ)句開(kāi)始(在某些系統(tǒng)中,要求有顯式的 begin transaction語(yǔ)句)。事務(wù)結(jié)束于 commit或rollback語(yǔ)句。commit語(yǔ)句將變化永久地寫(xiě)入數(shù)據(jù)庫(kù)中,而rollback語(yǔ)句擦除由這個(gè)事務(wù)帶來(lái)的任何變化。 9.3設(shè)計(jì)事務(wù) 事務(wù)是原子的,這個(gè)事務(wù)中所有SQL語(yǔ)句的結(jié)果要么被承認(rèn)要么被駁回。用戶決定事務(wù)的期限(大?。8鶕?jù)業(yè)務(wù)的需要,以及應(yīng)用領(lǐng)域和用戶-計(jì)算機(jī)交互風(fēng)格,一個(gè)事務(wù)可以只有一條SQL語(yǔ)句那樣短,它也可以涉及一系列SQL語(yǔ)句。 9.3設(shè)計(jì)事務(wù) 9.3.1短事務(wù)9.3.2長(zhǎng)事務(wù) 9.3.1短事務(wù) 大多數(shù)傳統(tǒng)的IS應(yīng)用都要求

36、短事務(wù)。短事務(wù)包含一條或多條SQL語(yǔ)句,它們必須盡可能快地完成,從而使得其他事務(wù)不被掛起。 9.3.1短事務(wù) 考慮一個(gè)飛機(jī)預(yù)定系統(tǒng),其中許多旅行代理為全球的旅客做航班預(yù)定。每個(gè)預(yù)定的事務(wù)必須快速由DBMS執(zhí)行,以便使得該航班的空位信息能及時(shí)更新,從而數(shù)據(jù)庫(kù)又可以處理等待在隊(duì)列中的下一個(gè)事務(wù),這是基本的。 9.3.1短事務(wù)9.3.1.1悲觀的并發(fā)控制 9.3.1.2隔離的層次 9.3.1.3自動(dòng)恢復(fù) 9.3.1.1悲觀的并發(fā)控制 DBMS和ODBMS的異常都被構(gòu)架為短事務(wù)。這些系統(tǒng)按照悲觀并發(fā)控制來(lái)工作。事務(wù)要處理的每個(gè)永久對(duì)象都獲取鎖。有四種對(duì)象的鎖:1.排它性(寫(xiě))鎖。其他事務(wù)必須等待,直到

37、持有這樣一個(gè)鎖的事務(wù)完成并將這種鎖釋放。2.更新(寫(xiě)意圖)鎖。其他事務(wù)可以讀這個(gè)對(duì)象,但一旦有這樣的需要,持有這種鎖的事務(wù)被保證能夠用排它的模式來(lái)對(duì)它進(jìn)行升級(jí)。3.讀(共享)鎖。其他事務(wù)可以讀并且可能獲得對(duì)這個(gè)對(duì)象的更新后的鎖。4.無(wú)鎖。其他事務(wù)可以在任何時(shí)候更新對(duì)象,只適合于允許“受污染的讀取”的應(yīng)用,即一個(gè)事務(wù)要讀的數(shù)據(jù)可以在這個(gè)事務(wù)完成之前就被修改或者甚至被(被另一個(gè)事務(wù))刪除。 9.3.1.2隔離的層次 與這四種鎖相關(guān)聯(lián)的是在并發(fā)執(zhí)行的事務(wù)之間的四個(gè)隔離的層次。系統(tǒng)設(shè)計(jì)者的責(zé)仟是決定哪個(gè)隔離層次適合數(shù)據(jù)庫(kù)上的事務(wù)的混合。這四個(gè)層次是:1.受污染的讀取。2.不可重復(fù)的讀取。3.幻影對(duì)象。

38、4.可重復(fù)讀取。1 受污染的讀取。 事務(wù)t1修改了一個(gè)對(duì)象但還沒(méi)有承認(rèn)這次修改,事務(wù)t2就讀取了一個(gè)對(duì)象。如果t1回滾這個(gè)事務(wù),則t2獲得了一個(gè)數(shù)據(jù)庫(kù)中從沒(méi)有存在的一個(gè)對(duì)象。 2.不可重復(fù)的讀取。 t1已經(jīng)讀取了一個(gè)對(duì)象,t2更新這個(gè)對(duì)象,t1再讀取這個(gè)對(duì)象,但這次它獲得這個(gè)對(duì)象的不同值。 3.幻影對(duì)象。 t1讀取了一組對(duì)象,t2在這個(gè)對(duì)象集中插入一個(gè)新對(duì)象,t1重復(fù)這個(gè)讀操作并將看到一個(gè)“幻影”對(duì)象。 4.可重復(fù)讀取。 t1和t2可以并發(fā)執(zhí)行,但這兩個(gè)事務(wù)的交叉執(zhí)行將產(chǎn)生同樣的結(jié)果,就像它們是一次執(zhí)行一個(gè)一樣(這稱(chēng)為可序列化的執(zhí)行)。 9.3.1.2隔離的層次 通?;贕UI的交互式IS應(yīng)用

39、要求短事務(wù)。然而,在同一個(gè)應(yīng)用中不同的事務(wù)的隔離層次可以不同。SQL語(yǔ)句set transaction可以用于這個(gè)目的。很明顯這中間需要折中增加隔離的層次就減少了系統(tǒng)的全面并發(fā)性。 9.3.1.2隔離的層次 一個(gè)至關(guān)重要的設(shè)計(jì)決定與上面的考慮無(wú)關(guān),事務(wù)的開(kāi)始必須總是要被延遲到最后一秒鐘。從客戶機(jī)窗口開(kāi)始一個(gè)事務(wù),然后在它確實(shí)可以完成這個(gè)工作之前,必須讓它一直等待到它從用戶處獲得了一些另外的信息,這一點(diǎn)是不可接受的。 9.3.1.2隔離的層次 用戶可能要很長(zhǎng)時(shí)間才能提供這些信息,或者甚至可能會(huì)在這個(gè)事務(wù)正在運(yùn)行時(shí)關(guān)閉計(jì)算機(jī)。事務(wù)超時(shí)后就回滾回去,但對(duì)整個(gè)系統(tǒng)的吞吐量的危害己經(jīng)產(chǎn)生了。 9.3.1

40、.3自動(dòng)恢復(fù) Murphy 法則說(shuō),如果什么事能夠出錯(cuò),那它就會(huì)的。程序可能含有錯(cuò)誤,運(yùn)行進(jìn)程可能被暫停或者中斷、動(dòng)力供應(yīng)可能失敗、磁頭可能斷裂等等。幸運(yùn)的是,DBMS為大多數(shù)情景提供自動(dòng)恢復(fù)的能力。只有磁盤(pán)數(shù)據(jù)出現(xiàn)物理丟失的情況下,需要DBA的干預(yù)來(lái)命令DBMS從最近的數(shù)據(jù)庫(kù)備份中恢復(fù)數(shù)據(jù)。 9.3.1.3自動(dòng)恢復(fù) 根據(jù)事務(wù)在故障點(diǎn)的狀態(tài),DBMS將自動(dòng)地執(zhí)行回滾操作,或者一旦問(wèn)題的原因被消除,再進(jìn)行事務(wù)的向前滾動(dòng)。這個(gè)恢復(fù)是自動(dòng)的,但是一個(gè)DBA能夠通過(guò)設(shè)置檢查點(diǎn)出現(xiàn)的頻率來(lái)控制恢復(fù)時(shí)間的長(zhǎng)短。一個(gè)檢查點(diǎn)強(qiáng)制DBMS暫時(shí)停止所有的事務(wù)并將所有的事務(wù)對(duì)數(shù)據(jù)庫(kù)的改變(它上個(gè)檢查點(diǎn)以來(lái)的)寫(xiě)進(jìn)數(shù)

41、據(jù)庫(kù)。 9.3.1.3自動(dòng)恢復(fù) 圖9-11示例了涉及從故障點(diǎn)進(jìn)行自動(dòng)恢復(fù)的問(wèn)題。事務(wù)t1在檢查點(diǎn)之后但在系統(tǒng)故障之前承認(rèn),由于DBMS不知道檢查點(diǎn)之后的所有的改變是否都已經(jīng)物理地寫(xiě)進(jìn)數(shù)據(jù)庫(kù),它將在從故障中恢復(fù)之后;向前滾動(dòng)(再做一次)事務(wù)t1。 9.3.1.3自動(dòng)恢復(fù) 9.3.1.3自動(dòng)恢復(fù) 事務(wù)t2在檢查點(diǎn)和故障之間有一個(gè)回滾作用到它上面。同事務(wù)t1的情況一樣,DBMS不知道這個(gè)被回滾的改變是否已經(jīng)記入磁盤(pán),DBMS將再進(jìn)行一次回滾。 其他事務(wù)是在檢查點(diǎn)之后開(kāi)始的。事務(wù)t3將向前滾動(dòng)以保證它的改變影響到數(shù)據(jù)庫(kù)。同樣,事務(wù)t4也將被重復(fù),即回滾。 9.3.1.3自動(dòng)恢復(fù) 事務(wù)t5不要求任何補(bǔ)救

42、行為,因?yàn)樗诔霈F(xiàn)故障的時(shí)候正在運(yùn)行。任何在故障之前由t5引起的改變還沒(méi)有被寫(xiě)進(jìn)數(shù)據(jù)庫(kù)中,所有中間的改變也只是寫(xiě)進(jìn)了日志文件。用戶意識(shí)到在出故障時(shí)這個(gè)事務(wù)正在進(jìn)行,可以在DBMS啟動(dòng)并再次運(yùn)行時(shí)重新發(fā)送這個(gè)事務(wù)。 9.3.1.4可編程的恢復(fù) 沒(méi)有預(yù)見(jiàn)的系統(tǒng)故障由DBMS自動(dòng)恢復(fù),然而設(shè)計(jì)者和程序員應(yīng)該控制任何可預(yù)見(jiàn)的事務(wù)問(wèn)題。DBMS提供一組到程序上的回滾選項(xiàng)以使得它可以從問(wèn)題中平緩地恢復(fù),從而可能使用戶意識(shí)不到在什么地方出了問(wèn)題。 9.3.1.4可編程的恢復(fù) 首先,GUI指南,如用戶控制或?qū)捜菰瓌t(7.3節(jié)),要求程序允許用戶出錯(cuò)并從中恢復(fù)。一個(gè)程序員控制的作用在程序正確的位置上的回滾可以將

43、數(shù)據(jù)庫(kù)恢復(fù)到以前的狀態(tài)(即撤消錯(cuò)誤),假如這個(gè)事務(wù)還沒(méi)有被確認(rèn)的話。 9.3.1.4可編程的恢復(fù) 如果這個(gè)事務(wù)已經(jīng)確認(rèn),那么程序員還可以選擇寫(xiě)一個(gè)補(bǔ)償事務(wù)。用戶然后可以請(qǐng)求執(zhí)行這個(gè)補(bǔ)償事務(wù)來(lái)撤消對(duì)數(shù)據(jù)庫(kù)的改變。補(bǔ)償事務(wù)特別設(shè)計(jì)來(lái)允許可編程的恢復(fù),并應(yīng)該在用例中建模。 9.3.1.4可編程的恢復(fù) 9.3.1.4.1保存點(diǎn) 9.3.1.4.2觸發(fā)器回滾 9.3.1.4.1保存點(diǎn) 保存點(diǎn)是程序中的一個(gè)語(yǔ)句,它將一個(gè)較長(zhǎng)的事務(wù)劃分成幾個(gè)小的部分。被命名的保存點(diǎn)插在程序的戰(zhàn)略性的關(guān)鍵位置上。程序員就可以選擇將進(jìn)程回滾到某個(gè)被命名的保存點(diǎn)上,而不是回滾到事務(wù)的開(kāi)始。 9.3.1.4.1保存點(diǎn) 例如,程序員

44、可以在update操作之前插入一個(gè)保存點(diǎn)。如果update失敗,程序回滾到這個(gè)保存點(diǎn)并試圖再執(zhí)行更新操作?;蛘撸绦蚩赡懿扇×硗獾男袨閬?lái)避免放棄整個(gè)事務(wù)。 9.3.1.4.1保存點(diǎn) 在較大的程序中,可以在每個(gè)子程序之前都插入保存點(diǎn)。如果子例程失敗,就可以回滾到這個(gè)子過(guò)程之前再用改過(guò)的參數(shù)來(lái)執(zhí)行它。如果必要的話,需要一個(gè)特別設(shè)計(jì)和編程的恢復(fù)子例程來(lái)做這個(gè)掃尾工作,以便使得這個(gè)事務(wù)能恢復(fù)執(zhí)行。 9.3.1.4.2觸發(fā)器回滾 觸發(fā)器回滾是一種特殊的保存點(diǎn)。就像在9.1.2.2節(jié)所解釋的那樣,一個(gè)觸發(fā)器可以用來(lái)編程任意復(fù)雜度的業(yè)務(wù)規(guī)則。有時(shí)當(dāng)一個(gè)觸發(fā)器拒絕修改一個(gè)表(由于這個(gè)事務(wù)試圖打破業(yè)務(wù)規(guī)則)時(shí)并

45、不想撤消整個(gè)事務(wù)。這個(gè)事務(wù)可能想要采取補(bǔ)救行為。 9.3.1.4.2觸發(fā)器回滾 針對(duì)上述原因,DBMS可以提供編寫(xiě)觸發(fā)器的可能以回滾整個(gè)事務(wù)或只回滾這個(gè)觸發(fā)器。在后一種情況下,程序(可能是一個(gè)存儲(chǔ)過(guò)程)可以分析這個(gè)問(wèn)題并決定進(jìn)一步的行為。甚至如果整個(gè)事務(wù)不得不被回滾,程序可能更好地解釋這個(gè)錯(cuò)誤的原因,并向用戶顯示更有智能的消息。 9.3.1.5設(shè)計(jì)存儲(chǔ)過(guò)程和觸發(fā)器 程序?qū)Ш綀D(9.2.2節(jié))可以進(jìn)一步擴(kuò)展以包括事務(wù)狀態(tài)。然而,從圖形分布的觀點(diǎn)來(lái)看這非常麻煩,另一個(gè)解決辦法可以是設(shè)計(jì)多個(gè)程序?qū)Ш綀D,每個(gè)都代表了導(dǎo)航的不同角度。其中有一個(gè)這樣的角度重點(diǎn)在捕獲事務(wù)的導(dǎo)航。 9.3.1.5設(shè)計(jì)存儲(chǔ)過(guò)程

46、和觸發(fā)器 在任一情況下,程序?qū)Ш綀D都確定了存儲(chǔ)過(guò)程和觸發(fā)器,還需要提供每個(gè)存儲(chǔ)過(guò)程和觸發(fā)器的目的、定義和詳細(xì)設(shè)計(jì)。特別地,需要部署一些偽代碼表示法來(lái)定義算法。 9.3.1.5設(shè)計(jì)存儲(chǔ)過(guò)程和觸發(fā)器 作為一個(gè)例子,我們下面給出關(guān)系管理應(yīng)用(參見(jiàn)圖 9-10和 9.2.2節(jié))中的存儲(chǔ)過(guò)程DeleteEvent的一個(gè)算法。這個(gè)過(guò)程檢查正試圖刪除事件的用戶(雇員)是否與創(chuàng)建這個(gè)事件的是同一個(gè)用戶。如果不是,這個(gè)刪除操作就被拒絕。這個(gè)過(guò)程還檢查這個(gè)事件是否已經(jīng)是當(dāng)前任務(wù)剩下的惟一事件。如果是,這個(gè)任務(wù)也被刪除。 9.3.1.5設(shè)計(jì)存儲(chǔ)過(guò)程和觸發(fā)器 BEGININPUT PARAMETERS(event_i

47、d,user_id) Select Event(where event_id = event_id) IF user_id = Event.created_emp_idTHENdelete Event(where event_id = event.id) IF no more events forTask.task_id = Event.task_id ANDEvent.event_id = event_idTHENdelete that TaskEnD IFELSEraise error(Only the creator of the event can delete that event)

48、ENDIFEND9.3.1.5設(shè)計(jì)存儲(chǔ)過(guò)程和觸發(fā)器 存儲(chǔ)過(guò)程DeleteEvent包含delete語(yǔ)句來(lái)從表Event和Task中刪除記錄。這些delete語(yǔ)句將啟動(dòng)對(duì)這些表的刪除觸發(fā)器(如果有的話)。如果這些觸發(fā)器的算法超出了正常的引用完整性檢查范圍,設(shè)計(jì)者還應(yīng)該為它們提供偽代碼規(guī)格說(shuō)明(包含對(duì)回滾策略的決定是觸發(fā)器回滾還是事務(wù)回滾)。 9.3.2長(zhǎng)事務(wù) 一些IS應(yīng)用的新的類(lèi)鼓勵(lì)用戶之間的合作。這些應(yīng)用被認(rèn)為是工作組計(jì)算應(yīng)用或者計(jì)算機(jī)支持協(xié)同工作(CSCW)應(yīng)用。這方面的例子包括許多辦公室應(yīng)用、協(xié)同寫(xiě)作、計(jì)算機(jī)輔助設(shè)計(jì)、CASE工具等。 9.3.2長(zhǎng)事務(wù) 工作組計(jì)算應(yīng)用在很多方面都有對(duì)與帶短

49、事務(wù)的傳統(tǒng)數(shù)據(jù)庫(kù)模型正交的數(shù)據(jù)庫(kù)需求,傳統(tǒng)數(shù)據(jù)庫(kù)模型將用戶分隔開(kāi),而工作組計(jì)算應(yīng)用要求長(zhǎng)事務(wù)、版本管理、合作并發(fā)控制等。 9.3.2長(zhǎng)事務(wù) ODB模型為工作組計(jì)算提供一個(gè)框架,并且許多ODBMS產(chǎn)品是針對(duì)這個(gè)應(yīng)用領(lǐng)域的。工作組計(jì)算應(yīng)用的用戶共享信息,并且能意識(shí)到他們正在進(jìn)行的工作是在共享的數(shù)據(jù)上進(jìn)行的。他們使用個(gè)人數(shù)據(jù)庫(kù)在他們自己的工作空間上工作,這個(gè)數(shù)據(jù)庫(kù)由從公共工作組數(shù)據(jù)庫(kù)(備份)中選出來(lái)的數(shù)據(jù)組成。他們?cè)谝粋€(gè)長(zhǎng)事務(wù)中工作,這個(gè)長(zhǎng)事務(wù)能夠跨越幾個(gè)計(jì)算片段(用戶能夠中斷,然后又可以返回,繼續(xù)在同一個(gè)長(zhǎng)事務(wù)中工作)。 9.3.2長(zhǎng)事務(wù) 長(zhǎng)事務(wù)的主要方面是,它不允許因?yàn)楣收隙跊](méi)有系統(tǒng)提供軌跡的

50、情況下自動(dòng)回滾。為了認(rèn)識(shí)這個(gè)需求的重要性,可以想像如果由于計(jì)算機(jī)故障,這本教科書(shū)現(xiàn)在要被“回滾(撤消)”時(shí)我的失望情緒!長(zhǎng)事務(wù)的撤消由用戶通過(guò)保存點(diǎn)來(lái)控制的,保存點(diǎn)永久性地存儲(chǔ)了用戶私有數(shù)據(jù)庫(kù)中的對(duì)象。 9.3.2長(zhǎng)事務(wù) 短事務(wù)的概念并沒(méi)有從工作組計(jì)算中完全去除。短事務(wù)對(duì)在保證組數(shù)據(jù)庫(kù)和私有數(shù)據(jù)庫(kù)之間的檢出和檢入操作的原子性和相互隔離是必需的。短鎖于是就被免除了,并且長(zhǎng)的永久鎖則由組數(shù)據(jù)庫(kù)作用到所有檢出的對(duì)象上。 9.3.2長(zhǎng)事務(wù) 長(zhǎng)事務(wù)模型的相關(guān)的目標(biāo)包括:允許合作的用戶之間的信息交換(甚至如果暫時(shí)不一致)。檢測(cè)數(shù)據(jù)的不一致并促成達(dá)成決定。利用對(duì)象的版本性來(lái)控制共享,不丟失系統(tǒng)故障情況下的工

51、作。 9.4雙向工程 現(xiàn)代軟件生產(chǎn)的迭代增量式過(guò)程(1.1.3.1節(jié))要求來(lái)自設(shè)計(jì)和實(shí)現(xiàn)之間的雙向工程的強(qiáng)有力的支持。雙向工程定義為向前的代碼產(chǎn)生和從代碼到設(shè)計(jì)模型的逆向工程的組合。雙向工程給出了“用圖形或文本視點(diǎn)工作的能力,工具保持了兩種視圖的一致性” 。 9.4雙向工程 在客戶機(jī)服務(wù)器應(yīng)用中,雙向工程可以單獨(dú)作用在客戶機(jī)應(yīng)用程序和服務(wù)器數(shù)據(jù)庫(kù)程序上。也許實(shí)際上是很可能的,不同的 CASE工具用于同一個(gè)項(xiàng)目的客戶機(jī)設(shè)計(jì)和服務(wù)器設(shè)計(jì)。還有,用于雙向工程的 CASE工具必須緊密地與特定的客戶機(jī)和或服務(wù)器程序設(shè)計(jì)環(huán)境集成在一起。 9.4雙向工程 9.4.1客戶機(jī)程序的雙向工程9.4.2數(shù)據(jù)庫(kù)的雙向

52、工程 9.4.3從關(guān)系數(shù)據(jù)庫(kù)到對(duì)象關(guān)系數(shù)據(jù)庫(kù)的再設(shè)計(jì)工程 9.4.1客戶機(jī)程序的雙向工程 客戶機(jī)應(yīng)用的雙向工程的原理相對(duì)來(lái)說(shuō)比較直接但問(wèn)題出在細(xì)節(jié)中。圖9-12是一個(gè)面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的雙向工程的典型周期的活動(dòng)圖。UML模型存儲(chǔ)在CASE資源庫(kù)中(就像在前面解釋的那樣,CASE資源庫(kù)本身是一個(gè)數(shù)據(jù)庫(kù)系統(tǒng),常常是一個(gè)對(duì)象數(shù)據(jù)庫(kù))。 9.4.1客戶機(jī)程序的雙向工程 UML Design Model(一個(gè)UML狀態(tài))不得不特別針對(duì)程序設(shè)計(jì)語(yǔ)言來(lái)開(kāi)發(fā)。Code Generation(一個(gè)UML活動(dòng))使用UML Design Model來(lái)產(chǎn)生Source Code(頭文件和實(shí)現(xiàn)文件)。任何用戶提供的定

53、義和來(lái)自前一個(gè)雙向工程的附加聲明被保留下來(lái)。 9.4.1客戶機(jī)程序的雙向工程 Source Code后來(lái)經(jīng)過(guò)正規(guī)程序設(shè)計(jì)的改變和擴(kuò)展。Modified Code在圖9-12中稱(chēng)為UML Generation的活動(dòng)UML Implemented Model的逆向工程。某種形式的可視化Model Differencing工具然后用來(lái)比較當(dāng)前的UML Implemented Model和最新的UML Design Model,從而揭示設(shè)計(jì)產(chǎn)生的改變。所有被接受的改變都傳播到UML Design Model中,并且開(kāi)始雙向工程的下一個(gè)循環(huán)。 9.4.1客戶機(jī)程序的雙向工程 9.4.1客戶機(jī)程序的雙向工

54、程 就像前面所觀察到的,問(wèn)題出在細(xì)節(jié)中。實(shí)踐中,在 CASE工具對(duì)程序設(shè)計(jì)語(yǔ)言的理解和對(duì)這個(gè)語(yǔ)言的特定的編譯器之間還有許多“遺漏的鏈接”。CASE工具可能對(duì)編譯通過(guò)的代碼報(bào)告分析錯(cuò)誤,因?yàn)樗赡懿荒茏R(shí)別由特定編譯器支持的語(yǔ)言的變體。 9.4.1客戶機(jī)程序的雙向工程 CASE工具可能不能解決一些對(duì)特定編譯器的聲明或特定庫(kù)源文件的引用。例如,如果源文件引用到在另一個(gè)文件中定義的符號(hào),但沒(méi)有顯式地包含這個(gè)文件時(shí),這個(gè)引用就不能被解決。雖然存在對(duì)許多這樣的問(wèn)題的工作區(qū),但它們肯定會(huì)導(dǎo)致不恰當(dāng)?shù)慕鉀Q方式,需要手工進(jìn)行調(diào)整。 9.4.1客戶機(jī)程序的雙向工程 這就是說(shuō),引起不恰當(dāng)并不是不對(duì)客戶機(jī)程序進(jìn)行雙向

55、工程的理由,這種不恰當(dāng)可以用手動(dòng)方式來(lái)改正,一旦改正UML模型就得出了與當(dāng)前程序匹配的文檔。否則就會(huì)完全失去對(duì)應(yīng)用實(shí)現(xiàn)的控制。 9.4.2數(shù)據(jù)庫(kù)的雙向工程 數(shù)據(jù)庫(kù)的雙向工程在設(shè)計(jì)端涉及物理數(shù)據(jù)模型(PDM),在實(shí)現(xiàn)端涉及數(shù)據(jù)庫(kù)(DB)。PDM模型用來(lái)代替UML,因?yàn)閁ML不支持物理數(shù)據(jù)庫(kù)設(shè)計(jì)(8.4節(jié))。PDM模型必須針對(duì)特定的DBMS。 9.4.2數(shù)據(jù)庫(kù)的雙向工程 圖9-13是關(guān)系數(shù)據(jù)庫(kù)的雙向工程的一個(gè)活動(dòng)圖。在數(shù)據(jù)庫(kù)的PDM模型構(gòu)造之后(狀態(tài)Initial PDM),就可以被存檔(活動(dòng)Archive)。比較已經(jīng)存檔的和當(dāng)前的PDM支持捕獲該模型的最新修改。 9.4.2數(shù)據(jù)庫(kù)的雙向工程 9.

56、4.2數(shù)據(jù)庫(kù)的雙向工程 從Initial PDM到Initial DB的前向工程由活動(dòng)Create DB完成。這個(gè)活動(dòng)產(chǎn)生一個(gè)DB模式,包括觸發(fā)器。 Initial DB通過(guò)遞歸活動(dòng)Load來(lái)填充數(shù)據(jù)?;顒?dòng)Modify DB引入模式的改變并引起到狀態(tài)Current DB的數(shù)據(jù)庫(kù)遷移。 9.4.2數(shù)據(jù)庫(kù)的雙向工程 在這個(gè)階段,有兩種可能性存在:對(duì)Current PDM的改變可以與產(chǎn)生Current DB同步(活動(dòng)Synchronize PDM with DB)或者反之亦然,即對(duì)Current DB的改變也可以與產(chǎn)生Current PDM同步(活動(dòng) Synchronize DB with PDM)。結(jié)果, Current PDM可能需要存檔并且Current DB也需要在重裝。 9.4.2數(shù)據(jù)庫(kù)的雙向工程 圖 9-14顯示了從Current DB(Sybase DB)到Current PDM(PowerDesigner PDM)的逆向工程一個(gè)片段(活動(dòng)Synchronize PDM with DB)的一個(gè)屏幕。

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論