數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)(北郵軟件學(xué)院研究生講義)-3.1-2.ppt_第1頁(yè)
數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)(北郵軟件學(xué)院研究生講義)-3.1-2.ppt_第2頁(yè)
數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)(北郵軟件學(xué)院研究生講義)-3.1-2.ppt_第3頁(yè)
數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)(北郵軟件學(xué)院研究生講義)-3.1-2.ppt_第4頁(yè)
數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)(北郵軟件學(xué)院研究生講義)-3.1-2.ppt_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

VIP免費(fèi)下載

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

文檔簡(jiǎn)介

北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3. 數(shù)據(jù)庫(kù)應(yīng)用程序體系結(jié)構(gòu),數(shù)據(jù)庫(kù)系統(tǒng)是指在計(jì)算機(jī)系統(tǒng)中引入數(shù)據(jù)庫(kù)后的系統(tǒng),一般由數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)管理系統(tǒng)、應(yīng)用系統(tǒng)、DBA、用戶組成。 本章介紹數(shù)據(jù)庫(kù)應(yīng)用程序的數(shù)據(jù)訪問(wèn)與數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的體系結(jié)構(gòu)。 3.1嵌入式SQL 3.2事務(wù)處理技術(shù) 3.3數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)體系結(jié)構(gòu) 3.4中間件,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1 嵌入式SQL,為什么使用嵌入式SQL? 有些數(shù)據(jù)訪問(wèn)任務(wù)對(duì)于交互式的非過(guò)程的SQL是無(wú)法完成的任務(wù)。 使用交互式SQL,必須知道表名、列名并且能夠?qū)懗龇险Z(yǔ)法的SQL語(yǔ)句。 實(shí)際的應(yīng)用系統(tǒng)是非常復(fù)雜的,數(shù)據(jù)庫(kù)訪問(wèn)只是其中一個(gè)部件。有些動(dòng)作如與用戶交互、圖形化顯示數(shù)據(jù)等只能用高級(jí)語(yǔ)言實(shí)現(xiàn)。 嵌入到過(guò)程性主語(yǔ)言中使用的SQL稱為嵌入式SQL。主語(yǔ)言可以是C或Java(不一定是Windows環(huán)境).也可以是Visual Basic, Delphi (Windows環(huán)境)等。 ORACLE的Pro*C即是使用嵌入式SQL的平臺(tái)。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1 嵌入式SQL,把SQL嵌入主語(yǔ)言使用時(shí)必須解決的三個(gè)問(wèn)題: 1區(qū)分 SQL語(yǔ)句與主語(yǔ)言語(yǔ)句,用EXEC SQL開始. 2數(shù)據(jù)庫(kù)工作單元和程序工作單元之間的通信. SQL語(yǔ)句可以使用主語(yǔ)言的程序變量(簡(jiǎn)稱主變量),這些變量名前加冒號(hào)(:)作標(biāo)志,以區(qū)別于字段名。這些變量由BEGIN DECLARE SECTION與END DECLARE SECTION語(yǔ)句之間說(shuō)明. 主語(yǔ)言中不能引用數(shù)據(jù)庫(kù)中的字段變量. SQL語(yǔ)句執(zhí)行后,系統(tǒng)要反饋給應(yīng)用程序若干信息,這些信息送到SQL的通信區(qū)SQLCA。SQLCA 用語(yǔ)句EXEC SQL INCLUDE加以定義。 3一個(gè)SQL語(yǔ)句原則上可產(chǎn)生或處理一組記錄,而主語(yǔ)言一次只能處理一個(gè)記錄,為此必須協(xié)調(diào)兩種處理方式。這是用游標(biāo)來(lái)解決的。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1 嵌入式SQL,主語(yǔ)言 + 嵌入SQL,預(yù)處理,主語(yǔ)言 + 函數(shù)調(diào)用,主語(yǔ)言編譯器,主語(yǔ)言執(zhí)行程序,預(yù)處理器把嵌入的SQL語(yǔ)句從主程序命令中分離出來(lái),轉(zhuǎn)換成相應(yīng)的主語(yǔ)言語(yǔ)句. 例: 1.UNIX環(huán)境下,程序員創(chuàng)建包含SQL的main.pc的源程序. 2.Oracle程序員調(diào)用預(yù)編譯器: proc iname=main.pc 生成main.c,其中SQL語(yǔ)句被純c語(yǔ)句(Orcale運(yùn)行期庫(kù)函數(shù))替換. 3.主語(yǔ)言編譯 cc -c main.c,生成main.o目標(biāo)文件. 4. 連編生成可執(zhí)行文件.,嵌入式SQL的執(zhí)行,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.1 C語(yǔ)言中嵌入式SQL,#include #include “prompt.h” exec sql include sqlca; /*聲明通訊區(qū)*/ char cid_prompt=“請(qǐng)輸入顧客號(hào):”; int main( ) exec sql begin declare section; char cust_id5,cust_name14; float cust_discnt; char user_name20,user_ped20; exec sql end declare section; /*聲明變量*/ exec sql whenever sqlerror goto report_error; exec sql whenever not found goto notfound; /*出錯(cuò)處理*/ strcpy(user_name,”mytest”); strcpy(user_pwd,”test”); exec sql connect :user_name identified by :user_pwd; /*連接*/,while(prompt(cid_prompt,1,cust_id,4)=0) exec sql select cname,discnt into :cust_name,:cust_discnt from customers where cid=:cust_id; exec sql commit work; printf(“顧客名: %s 折扣率: %5.1fn”, cust_name,cust_discnt); continue; notfound: printf(“沒(méi)找到 %s,繼續(xù)n”,cust_id); /*根據(jù)輸入的顧客ID查詢顧客信息*/ exec sql commit release; /*正常釋放連接*/ return 0; report_error: print_dberror(); /*出錯(cuò)信息*/ exec sql rollback release; /*釋放連接*/ return 1; ,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.1 C語(yǔ)言中嵌入式SQL,區(qū)分SQL語(yǔ)句與C語(yǔ)言語(yǔ)句 嵌入的SQL語(yǔ)句以EXEC SQL開始,以分號(hào)(;)結(jié)束。 例:exec sql select came,discnt into :cust_name,:cust_discnt from customers where cid=:cust_id; 嵌入SQL語(yǔ)句與C語(yǔ)言之間的數(shù)據(jù)傳遞 宿主變量(宿主變量出現(xiàn)于SQL語(yǔ)句中時(shí),前面加(:)以區(qū)別列名) C變量既可以用在C語(yǔ)句中,也可用在SQL語(yǔ)句中, 用來(lái)在兩者之間傳遞數(shù)據(jù)。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.1 C語(yǔ)言中嵌入式SQL,宿主變量的聲明 在嵌入式SQL語(yǔ)句中使用宿主變量,必須先聲明它們:聲明為通常的C變量,并將其放在下列標(biāo)識(shí)語(yǔ)句之間, EXEC SQL BEGIN DECLARE SECTION EXEC SQL END DECLARE SECTION 例: exec sql begin declare section; char cust_id5=c001; char cust_name14; float cust_discnt; exec sql end declare section;,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.1 C語(yǔ)言中嵌入式SQL,在SQL中建立連接和釋放連接 在一個(gè)嵌入式SQL程序開始,程序面臨著和交互式用戶同樣的問(wèn)題:怎樣與數(shù)據(jù)庫(kù)建立連接. 例: exec sql begin declare section; /*聲明變量*/ char user_name10,user_ped10; exec sql end declare section; strcpy(user_name,mytest); /*變量賦值*/ strcpy(user_pwd,test); exec sql connect :user_name identified by :user_pwd; /*Oracle連接*/ 例:exec sql commit release;/*Oracle斷開連接*/ exec sql rollback release;/*Oracle斷開連接*/,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.2 游標(biāo),SQL與主語(yǔ)言之間操作方式的協(xié)調(diào) SQL:一次一集合。 C語(yǔ)言:一次一記錄。 游標(biāo):在查詢結(jié)果的記錄集合中移動(dòng)的指針。 若一個(gè)SQL語(yǔ)句返回單個(gè)元組,則不用游標(biāo)。 若一個(gè)SQL語(yǔ)句返回多個(gè)元組,則使用游標(biāo)。 不需要游標(biāo)的數(shù)據(jù)操作 結(jié)果是一個(gè)元組的select語(yǔ)句 exec sql select came,discnt into :cust_name,:cust_discnt from customers where cid=:cust_id;,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.2 游標(biāo),需要游標(biāo)的數(shù)據(jù)操作 當(dāng)select語(yǔ)句的結(jié)果中包含多個(gè)元組時(shí),使用游標(biāo)可以逐個(gè)存取這些元組。 活動(dòng)集:select語(yǔ)句返回的元組的集合。 當(dāng)前行:活動(dòng)集中當(dāng)前處理的那一行。游標(biāo)即是指向當(dāng)前行的指針。 游標(biāo)分類: 滾動(dòng)游標(biāo):游標(biāo)的位置可以來(lái)回移動(dòng),可在活動(dòng)集中取任意元組。 非滾動(dòng)游標(biāo):只能在活動(dòng)集中順序地取下一個(gè)元組。 更新游標(biāo):數(shù)據(jù)庫(kù)對(duì)游標(biāo)指向的當(dāng)前行加鎖,當(dāng)程序讀下一行數(shù)據(jù)時(shí),本行數(shù)據(jù)解鎖,下一行數(shù)據(jù)加鎖。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.2 游標(biāo),定義一個(gè)游標(biāo),使之對(duì)應(yīng)一個(gè)select語(yǔ)句 DECLARE 游標(biāo)名 SCROLL CURSOR FOR select語(yǔ)句 for update of列表名 for update任選項(xiàng),表示該游標(biāo)可用于對(duì)當(dāng)前行的修改與刪除。 打開一個(gè)游標(biāo),執(zhí)行游標(biāo)對(duì)應(yīng)的查詢,結(jié)果集合為該游標(biāo)的活動(dòng)集。 OPEN 游標(biāo)名 在游標(biāo)被聲明之后,它仍然不是活動(dòng)狀態(tài),在程序開始檢索信息之前,執(zhí)行SQL的OPEN語(yǔ)句打開這個(gè)游標(biāo),游標(biāo)被打開之后,可使用取(fetch)操作從游標(biāo)中每次檢索一行,程序完成檢索后,應(yīng)關(guān)閉游標(biāo),北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.2 游標(biāo),在活動(dòng)集中將游標(biāo)移到特定的行,并取出該行數(shù)據(jù)放到相應(yīng)的宿主變量中。 FETCH NEXT | PRIOR | FIRST | LAST | CURRENT | RELETIVE n | ABSOLUTE n 游標(biāo)名 INTO 宿主變量表 關(guān)閉游標(biāo),釋放活動(dòng)集及其所占資源。需要再使用該游標(biāo)時(shí),執(zhí)行open語(yǔ)句。 CLOSE 游標(biāo)名 刪除游標(biāo),以后便不能再對(duì)該游標(biāo)執(zhí)行open語(yǔ)句了. FREE 游標(biāo)名,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.2 游標(biāo),#define ture 1 #include #include “prompt.h” exec sql include sqlca; /*聲明通訊區(qū)*/ int main( ) char cid_prompt=“請(qǐng)輸入顧客號(hào):”; exec sql begin declare section; char cust_id5,agent_id4; double dollar_sum; char user_name20,user_ped20; exec sql end declare section; /*聲明變量*/ exec sql declare agent_dollars cursor for select aid,sum(dollars) from orders where cid=:cust_id group by aid;/*游標(biāo)*/ exec sql whenever sqlerror goto report_error; exec sql whenever not found goto finish; /*出錯(cuò)處理*/ strcpy(user_name,”mytest”); strcpy(user_pwd,”test”);,exec sql connect :user_name identified by :user_pwd; /*連接*/ while(prompt(cid_prompt,1,cust_id,4)=0) exec sql open agent_dollars; while (ture) exec sql fetch agent_dillars into :agent_id,:dollar_sum; /*游標(biāo)取值*/ printf(“ %s %11.2fn”, agent_id,dollar_sum); continue; finish: exec sql close agent_dollars; exec sql commit work; /*游標(biāo)關(guān)閉*/ /*輸入顧客ID的代理商和金額*/ exec sql commit release; /*正常釋放連接*/ return 0; report_error: print_dberror(); /*出錯(cuò)信息*/ exec sql rollback release; /*釋放連接*/ return 1; ,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.3 通訊區(qū),SQL語(yǔ)句執(zhí)行信息反饋 良好的應(yīng)用程序必須提供對(duì)錯(cuò)誤的處理,應(yīng)用程序需要知道SQL語(yǔ)句是否正確執(zhí)行了,發(fā)生錯(cuò)誤時(shí)的錯(cuò)誤代碼,執(zhí)行時(shí)遇到特殊情況時(shí)的警告信息。 SQL通訊區(qū)SQLCA是一個(gè)已被聲明過(guò)的內(nèi)存結(jié)構(gòu),每一嵌入SQL語(yǔ)句的執(zhí)行情況在其執(zhí)行完成后寫入U(xiǎn)SERCA結(jié)構(gòu)中的各變量中, 根據(jù)SQLCA中的內(nèi)容可以獲得每一嵌入SQL語(yǔ)句執(zhí)行后的信息,應(yīng)用程序就可以做相應(yīng)的處理。 為了說(shuō)明 (USERCA),必須在應(yīng)用程序中包括: EXEC SQL INCLUDE SQLCA;,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.3 通訊區(qū),SQLCODE:SQLCODE是SQLCA的結(jié)構(gòu)一個(gè)成員。它是一個(gè)每次執(zhí)行完SQL語(yǔ)句都被更新的整型變量。 如果執(zhí)行成功,SQLCODE為0; 如果語(yǔ)句沒(méi)有產(chǎn)生錯(cuò)誤,但遇到了沒(méi)有數(shù)據(jù),SQLCODE為100; 除去成功返回0或沒(méi)有數(shù)據(jù)返回100的情況,其他都是某種錯(cuò)誤并返回一個(gè)負(fù)數(shù)。 SQL-99和X/OpenSQL等標(biāo)準(zhǔn)提倡用SQLSTATE取代SQLCODE檢測(cè)SQL的執(zhí)行情況,并將SQLSTATE設(shè)置為標(biāo)準(zhǔn),但在產(chǎn)品中還不一定支持。例如ORACLE中,預(yù)處理程序運(yùn)行時(shí)必須設(shè)置MODE=ANSI才能支持SQLSTATE.,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.3 通訊區(qū),SQLSTATE:SQLSTATE作用與SQLCODE作用相同,但它是在標(biāo)準(zhǔn)方式下起作用。SQLCODE是一個(gè)整數(shù),SQLSTATE是一個(gè)長(zhǎng)度為5的只能由A到Z字符和0到9數(shù)字組成的字符串。5個(gè)字符分為兩組,前兩個(gè)為類碼,后三個(gè)為子類碼。SQL標(biāo)準(zhǔn)規(guī)定:分類碼的第一個(gè)字符可為A到H或0到4,這樣分類主要為了統(tǒng)一,第一個(gè)字符為I到Z或5到9的分類碼留給軟件開發(fā)者去定義。 分類碼00指成功,01指成功但產(chǎn)生一個(gè)警告,02指沒(méi)有數(shù)據(jù),等價(jià)于SQLCODE的100,非00、01和02指語(yǔ)句沒(méi)有成功完成。可以查閱數(shù)據(jù)庫(kù)系統(tǒng)產(chǎn)品的嵌入式SQL參考指南得到SQLSTATE、SQLCODE、SQLCA,確定主要的出錯(cuò)條件,以它們的報(bào)告方式。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.4 錯(cuò)誤處理,Whenever語(yǔ)句使我們?cè)谟龅匠鲥e(cuò)和其他情況時(shí),控制程序的運(yùn)行: EXEC SQL WHENEVER 條件 動(dòng)作 條件可以是 SQLERROR:執(zhí)行錯(cuò)誤,如連接不成功等; NOT FOUND:沒(méi)有數(shù)據(jù),如游標(biāo)指針到頭或到尾等; SQLWARNING:警告錯(cuò)誤。 動(dòng)作可以是 CONTINUE:繼續(xù)正常流程; GOTO 標(biāo)號(hào):轉(zhuǎn)移到標(biāo)號(hào)行繼續(xù)執(zhí)行; STOP:結(jié)束程序,撤消當(dāng)前事務(wù),并斷開數(shù)據(jù)庫(kù)連接; DO 函數(shù):引發(fā)一個(gè)對(duì)已經(jīng)命名的函數(shù)的調(diào)用。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.4 錯(cuò)誤處理,沒(méi)有WHENEVER語(yǔ)句時(shí)缺省動(dòng)作是Continue. 如果SQLCODE為負(fù),則SQLERROR為真,如果SQLCODE為100或SQLSTATE為02000,則NOT FOUND為真。抽取錯(cuò)誤信息的確切代碼依賴于所使用的數(shù)據(jù)庫(kù)系統(tǒng)。 WHENEVER語(yǔ)句的主要價(jià)值在于減少處理錯(cuò)誤的代碼行數(shù),另外WHENEVER的語(yǔ)法可以在不同數(shù)據(jù)庫(kù)系統(tǒng)之間進(jìn)行最大限度的移植。例如利用檢測(cè)條件NOT FOUND在不同數(shù)據(jù)庫(kù)產(chǎn)品中可能有不同的sqlca.sqlcode值,但NOT FOUND卻始終表示沒(méi)有發(fā)現(xiàn)記錄這一錯(cuò)誤。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.5 指示變量,如果一個(gè)宿主變量所對(duì)應(yīng)的數(shù)據(jù)庫(kù)字段允許空值,或字符串類型的宿主變量的長(zhǎng)度可能小于所對(duì)應(yīng)的數(shù)據(jù)庫(kù)字段的長(zhǎng)度,則需要一個(gè)指示變量來(lái)指明數(shù)據(jù)庫(kù)訪問(wèn)的返回狀態(tài)。 指示變量: 是一個(gè)C變量,用來(lái)指示返回給宿主變量的值是否為null值,以及返回給宿主變量的字符串是否發(fā)生了截?cái)唷?指示變量的返回值: = 0:取到主變量的值不空,沒(méi)有發(fā)生截?cái)唷?= 1:取到主變量的值為空值。 0:取到主變量的值發(fā)生了截?cái)?,指示?量的值是截?cái)嗲暗淖址膶?shí)際長(zhǎng)度。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.5 指示變量,指示變量的用法:聲明與宿主變量的聲明方式一樣,在數(shù)據(jù)操縱語(yǔ)句中,在宿主變量和指示變量之間加( : )或關(guān)鍵字indicator。 例:exec sql begin declare section float cust_discnt; short int cd_ind; exec sql end declare section exec sql select discnt into :cust_discnt indicator:cd_ind from customers where cid=:cust_id; 在檢索之后,如果cd_ind的值為-1,則變量cust_discnt得到了一個(gè)空值;如果為0,則cust_discnt中的值是正常的。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.5 指示變量,不管讀取數(shù)據(jù)還是更新數(shù)據(jù),都可以用指示變量的值-1代表空值。 例:要將表customers的某一行的discnt值設(shè)置為空值,可以這樣寫: cd_ind=-1 exec sql update customers set discnt=:cust_discnt indicator :cd_ind where cid=:cust_id; 實(shí)際上還可以進(jìn)一步擴(kuò)展指示變量的值,例如DB2 UDB的產(chǎn)品中,如果指示變量的值為-2,意味著是由于一個(gè)錯(cuò)誤而不是數(shù)據(jù)庫(kù)中存儲(chǔ)的值而使檢索到的值為空值。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.1.6 嵌入式SQL語(yǔ)句,檢索:EXEC SQL SELECT ALL|DISTINCT 表達(dá)式 INTO 宿主變量 FROM 表名 WHERE 條件; 游標(biāo)定義:EXEC SQL DECLEARE 游標(biāo)名 CURSOR FOR 子查詢 ORDER BY FOR READ ONLY |UPDATE OF 列名; 游標(biāo)打開與關(guān)閉:EXEC SQL OPEN|CLOSE 游標(biāo)名; 游標(biāo)取值:EXEC SQL FETCH NEXT|PRIOR|FIRST|LAST |CURRENT|RELETIVE n|ABSOLUTE n 游標(biāo)名 INTO 宿主變量; 刪除:EXEC SQL DELETE FROM 表名 WHERE條件|WHERE CURRENT OF 游標(biāo)名; 修改:EXEC SQL UPDATE 表名 SET 列=表達(dá)式 WHERE 條件|WHERE CURRENT OF 游標(biāo)名; 增加:EXEC SQL INSERT INTO 表名 (列名) VALUES(表達(dá)式);,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2 事務(wù)處理技術(shù),保證數(shù)據(jù)的一致性和數(shù)據(jù)庫(kù)的并行性,是衡量一個(gè)數(shù)據(jù)庫(kù)的最基本和最重要的指標(biāo)之一。 一致性:以一致性規(guī)則為基礎(chǔ)的數(shù)據(jù)邏輯關(guān)系。如轉(zhuǎn)帳任務(wù)不能造成帳戶金額的不平衡。 并行性:各個(gè)用戶能夠?qū)崿F(xiàn)對(duì)數(shù)據(jù)庫(kù)資源的共享。 數(shù)據(jù)并發(fā)是多用戶系統(tǒng)的基本要求,數(shù)據(jù)一致是因?yàn)橛袛?shù)據(jù)并發(fā)存在,為了適應(yīng)多用戶系統(tǒng),協(xié)調(diào)管理數(shù)據(jù)庫(kù)中的數(shù)據(jù),保證各個(gè)用戶的任務(wù)能夠順利準(zhǔn)確地完成。 事務(wù)處理是實(shí)現(xiàn)數(shù)據(jù)庫(kù)一致性和并行性的重要手段。在保證一致性的前提下最大限度地提高并發(fā)度。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2 事務(wù)處理技術(shù),數(shù)據(jù)操縱以SQL為基礎(chǔ),但單條SQL語(yǔ)句不一定能完成所有的用戶請(qǐng)求,許多用戶請(qǐng)求需要若干條SQL語(yǔ)句,而且這些語(yǔ)句有關(guān)聯(lián),要么全做,要么全不做。 如果許多用戶的眾多SQL語(yǔ)句不加控制,隨意執(zhí)行,必然破壞數(shù)據(jù)的一致完整,出現(xiàn)丟失修改、不可重復(fù)讀、讀臟數(shù)據(jù)的錯(cuò)誤。 數(shù)據(jù)庫(kù)系統(tǒng)要對(duì)用戶的操作進(jìn)行控制(事務(wù)控制和封鎖技術(shù)),保證并發(fā)的同時(shí)保證數(shù)據(jù)的一致。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.1 事務(wù)概念,事務(wù)是由一系列操作序列構(gòu)成的程序執(zhí)行單元,這些操作要么都做,要么都不做,是一個(gè)不可分割的工作單位。 事務(wù)是數(shù)據(jù)庫(kù)提供的一種手段,應(yīng)用程序員將一系列操作組合在一起作為一個(gè)整體以便數(shù)據(jù)庫(kù)系統(tǒng)提供保證。事務(wù)才是對(duì)數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行操作的最小合法單位。DBMS在事務(wù)級(jí)而不是在語(yǔ)句級(jí)確保數(shù)據(jù)的一致性。 事務(wù)以Begin transaction開始,以Commit work或Rollback work結(jié)束。 嵌入式SQL: EXEC SQL COMMIT WORK; EXEC SQL ROLLBACK WORK;,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.1 事務(wù)概念,Commit work表示提交,事務(wù)正常結(jié)束。 Rollback work表示事務(wù)非正常結(jié)束,撤消事務(wù)已做的操作,回滾到事務(wù)開始時(shí)狀態(tài)。 事務(wù)的內(nèi)容只限于數(shù)據(jù)更新操作(增刪改),不包含其他SQL命令。 在標(biāo)準(zhǔn)SQL中,沒(méi)有Begin transaction語(yǔ)句,上一條Commit或Rollback或SQL修改命令即為事務(wù)的開始。 有的DBMS使用Begin transaction作為事務(wù)的開始。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.1 事務(wù)概念,事務(wù)特性(ACID) 原子性(Atomicity) 事務(wù)的更新操作必須作為一個(gè)整體,其中包含的所有操作要么全做,要么全不做。 原子性由系統(tǒng)恢復(fù)機(jī)制實(shí)現(xiàn)。 一致性(Consistency) 事務(wù)的成功完成將數(shù)據(jù)庫(kù)從一個(gè)一致狀態(tài)轉(zhuǎn)變到另一個(gè)一致狀態(tài)。 事務(wù)開始前,數(shù)據(jù)庫(kù)處于一致性的狀態(tài);事務(wù)結(jié)束后,數(shù)據(jù)庫(kù)必須仍處于一致性狀態(tài)。 數(shù)據(jù)庫(kù)的一致性狀態(tài)由用戶來(lái)負(fù)責(zé)。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.1 事務(wù)概念,事務(wù)特性(ACID) 隔離性(Isolation) 系統(tǒng)必須保證事務(wù)不受其它并發(fā)執(zhí)行事務(wù)的影響。 對(duì)任何一對(duì)事務(wù)T1,T2,在T1看來(lái),T2要么在T1開始之前已經(jīng)結(jié)束,要么在T1完成之后再開始執(zhí)行。 隔離性通過(guò)并發(fā)控制機(jī)制實(shí)現(xiàn)。 持久性(Durability) 一個(gè)事務(wù)一旦提交之后,它對(duì)數(shù)據(jù)庫(kù)的影響必須是永久的,無(wú)論發(fā)生何種系統(tǒng)故障。 持久性通過(guò)恢復(fù)機(jī)制實(shí)現(xiàn)。 事務(wù)的原子性、隔離性、持久性由數(shù)據(jù)庫(kù)系統(tǒng)加以保證,一致性一般由程序員在編寫程序中予以保證。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.2 事務(wù)的調(diào)度,事務(wù)的調(diào)度:DBMS在處理用戶提交事務(wù)時(shí)的策略,即事務(wù)調(diào)度。事務(wù)的執(zhí)行順序稱為一個(gè)調(diào)度,表示事務(wù)的指令在系統(tǒng)中執(zhí)行的時(shí)間順序。 一組事務(wù)的調(diào)度必須保證 包含了所有事務(wù)的操作指令 一個(gè)事務(wù)中指令的順序必須保持不變。 串行調(diào)度 在串行調(diào)度中,屬于同一事務(wù)的指令緊挨在一起。 對(duì)于有n個(gè)事務(wù)的事務(wù)組,可以有n!個(gè)有效調(diào)度。 并行調(diào)度 在并行調(diào)度中,來(lái)自不同事務(wù)的指令可以交叉執(zhí)行。 當(dāng)并行調(diào)度等價(jià)于某個(gè)串行調(diào)度時(shí),則稱它是正確的。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.2 事務(wù)的調(diào)度,ANSI SQL-99標(biāo)準(zhǔn)中,一致性級(jí)別(隔離級(jí)別)的定義 serializable:一個(gè)調(diào)度的執(zhí)行必須等價(jià)于一個(gè)串行調(diào)度的結(jié)果。 repeatable read:只允許讀取已提交的記錄,并要求一個(gè)事務(wù)對(duì)同一記錄的兩次讀取之間,其它事務(wù)不能對(duì)該記錄進(jìn)行更新。 read committed:只允許讀取已提交的記錄,但不要求可重復(fù)讀。 read uncommitted:允許讀取未提交的記錄。 在SQL-99的語(yǔ)法中允許在啟動(dòng)事務(wù)的SQL語(yǔ)句之前設(shè)置隔離級(jí)別。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.3 事務(wù)的數(shù)據(jù)封鎖,數(shù)據(jù)庫(kù)管理系統(tǒng)采用數(shù)據(jù)封鎖技術(shù)和事務(wù)技術(shù)解決并發(fā)性和一致性問(wèn)題.數(shù)據(jù)封鎖有兩種封鎖模式: 專用鎖:當(dāng)一個(gè)事務(wù)以專用方式封鎖某個(gè)資源時(shí),只有此事務(wù)可以改變其中的內(nèi)容,在該事務(wù)結(jié)束或釋放其資源后,其它事務(wù)才能使用; 共享鎖:允許已封鎖的資源被其它事務(wù)適度共享,多個(gè)事務(wù)可以在同一資源上申請(qǐng)共享鎖. 根據(jù)封鎖的類型、持鎖時(shí)間、何時(shí)釋放的規(guī)則,將封鎖協(xié)議分為一級(jí)封鎖協(xié)議、二級(jí)封鎖協(xié)議、三級(jí)封鎖協(xié)議。不同封鎖協(xié)議在不同程度上保證數(shù)據(jù)一致性和系統(tǒng)并發(fā)性。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.3 事務(wù)的數(shù)據(jù)封鎖,在SQL語(yǔ)句執(zhí)行時(shí),所有必要的封鎖均由DBMS自動(dòng)完成(也可顯式加鎖),事務(wù)中所有為執(zhí)行SQL語(yǔ)句建立的封鎖均要延續(xù)到事務(wù)結(jié)束時(shí)才能釋放,否則一個(gè)數(shù)據(jù)庫(kù)對(duì)象在同一時(shí)間段內(nèi)被多個(gè)事務(wù)交替操作,可能造成對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的破壞. 當(dāng)參與封鎖的事務(wù)較多,而每個(gè)事務(wù)封鎖的資源也較多時(shí),可能出現(xiàn)死鎖情況。 預(yù)防死鎖的方法有一次封鎖法、順序封鎖法。 死鎖的診斷有超時(shí)法、有向圖法。死鎖發(fā)生后,DBMS通常選擇一個(gè)處理死鎖代價(jià)最小的事務(wù)將其撤消,并恢復(fù)該事務(wù)。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.3 事務(wù)的數(shù)據(jù)封鎖,兩段鎖協(xié)議(Two-phase Locking) 內(nèi)容: 在對(duì)任何數(shù)據(jù)進(jìn)行讀寫之前,事務(wù)首先要獲得對(duì)該數(shù)據(jù)的封鎖。 在釋放一個(gè)封鎖之后,事務(wù)不再獲得任何其它封鎖。 即事務(wù)分為兩個(gè)階段: 生長(zhǎng)階段:獲得封鎖。 收縮階段:釋放封鎖。 定理:若所有事務(wù)均遵從兩段鎖協(xié)議,則這些事務(wù)的所有并行調(diào)度都是可串行化的。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.4 ORACLE事務(wù)控制-回退段,ORACLE為了適應(yīng)事務(wù)控制設(shè)置了回退段這一數(shù)據(jù)庫(kù)對(duì)象.系統(tǒng)利用回退段來(lái)確保諸如讀一致性、數(shù)據(jù)庫(kù)恢復(fù)等管理功能。 ORACLE在缺省情況下,讀數(shù)據(jù)不加鎖,通過(guò)回退段(Rollback Segment)保證用戶不讀臟數(shù)據(jù)和可重復(fù)讀. 表空間中的數(shù)據(jù)按段來(lái)組織,數(shù)據(jù)段、索引段、暫存段和回退段,回退段是一塊磁盤存儲(chǔ)區(qū)域,回退段可以由用戶創(chuàng)建,但只能由系統(tǒng)進(jìn)程使用。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.4 ORACLE事務(wù)控制-回退段,回退段中的數(shù)據(jù)是為事務(wù)服務(wù)的,每執(zhí)行事務(wù)時(shí),系統(tǒng)先在指定回退段上記錄將要對(duì)數(shù)據(jù)進(jìn)行的更改,以事務(wù)為單位,各個(gè)事務(wù)的回退信息鏈接在一起。 當(dāng)事務(wù)要回退時(shí),利用回退信息將數(shù)據(jù)塊中的數(shù)據(jù)恢復(fù)到先前的狀態(tài)。 事務(wù)成功提交后,回退信息逐漸失效(在提交之前申請(qǐng)的查詢需要這些信息保證讀一致性,事務(wù)提交前對(duì)數(shù)據(jù)的變動(dòng)不會(huì)為其他用戶所知曉)?;赝硕慰梢匝h(huán)使用。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.4 ORACLE事務(wù)控制-回退段,用回退段保證讀一致性(不讀臟數(shù)據(jù)和可重復(fù)讀):,1,2,3,4,5,6,Tu2,Tu1,Ts3,Ts2,Ts1,時(shí)間,事務(wù),表customers,數(shù)據(jù)緩沖區(qū) cid discnt c001 10 11 15,數(shù)據(jù)段:,回退段:,Tu1,Tu2,例: 有5個(gè)事務(wù)并發(fā): Ts1,Ts2,Ts3為查詢事務(wù), Tu1,Tu2為更新事務(wù). Tu1:UPDATE customers SET discnt=discnt*1.1 WHERE cid=c001; Tu2: UPDATE customers SET discnt=15 WHERE cid=c001; 事務(wù)開始和完成時(shí)間段如右上圖: 事務(wù)對(duì)回退段影響如右下圖:,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.4 ORACLE事務(wù)控制-回退段,用回退段保證讀一致性(不讀臟數(shù)據(jù)和可重復(fù)讀): 事務(wù)的開始順序和基準(zhǔn)時(shí)間為:Ts1=0 Tu1=3 Ts2=4 Tu2=5 Ts3=6; 事務(wù)的完成順序和基準(zhǔn)時(shí)間為:Tu1=4 Tu2=6 Ts16 Ts26 Ts36; 數(shù)據(jù)緩沖區(qū)的內(nèi)容是最新更改的結(jié)果, 回退段按時(shí)間順序記錄了每次更改以前的數(shù)據(jù); 盡管Tu1和Tu2兩次更改了discnt的值, 但Tu1開始之前Ts1已開始,所以在時(shí)間4結(jié)束的Tu1回退信息并不馬上消失,保證Ts1從回退段中查得discnt為10,Tu2開始之前Ts2已開始,所以在時(shí)間6結(jié)束的Tu2回退信息并不馬上消失,保證Ts2從回退段中查得discnt為11, Ts3基準(zhǔn)時(shí)間是6,從緩沖區(qū)中查得discnt為15. Ts1和Ts2結(jié)束后才清除回退段信息.,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.4 ORACLE事務(wù)控制-回退段,在數(shù)據(jù)庫(kù)創(chuàng)建時(shí)SYSTEM表空間中建立了SYSTEM回退段。每個(gè)數(shù)據(jù)庫(kù)可以有一個(gè)或多個(gè)回退段,最好只將SYSTEM回退段用于系統(tǒng)事務(wù),將用戶事務(wù)分配在其他回退段上,以提高資源利用率。 創(chuàng)建回退段時(shí)可同時(shí)設(shè)定其存儲(chǔ)參數(shù),回退段至少要包括兩個(gè)區(qū)間(MINEXTENTS),回退段的區(qū)間總數(shù)受到回退段存儲(chǔ)參數(shù)MAXEXTENTS的限制。 一個(gè)事務(wù)的回退信息按順序在指定的回退段中寫入。創(chuàng)建多少個(gè)回退段及給每個(gè)回退段分配多少區(qū)間,要考慮可能出現(xiàn)的最大并發(fā)事務(wù)數(shù),每個(gè)回退段所能同時(shí)服務(wù)的事務(wù)數(shù)。,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.4 ORACLE事務(wù)控制-回退段,事務(wù)的執(zhí)行過(guò)程(采用日志和回退段雙重記錄事務(wù)活動(dòng)):,進(jìn)入回退段,寫入回退信息,從數(shù)據(jù)段讀入緩沖區(qū),SQL處理,記載日志文件,提交,寫更改結(jié)果到磁盤,回退,寫回退信息到磁盤,事務(wù)第一條更新語(yǔ)句,事務(wù)結(jié)束,N,Y,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.5 ORACLE事務(wù)控制-語(yǔ)句,ORACLE事務(wù)控制語(yǔ)句: COMMIT WORK; 清除本事務(wù)的全部保留點(diǎn),清除為執(zhí)行事務(wù)建立的封鎖機(jī)制,結(jié)束本事務(wù),提交數(shù)據(jù). SAVEPOINT 保留點(diǎn)名; 保留點(diǎn)是一事務(wù)范圍內(nèi)的中間標(biāo)志,經(jīng)常用于將長(zhǎng)事務(wù)劃分為短小的部分,保留點(diǎn)可標(biāo)志在長(zhǎng)事務(wù)的任何點(diǎn),允許回退該點(diǎn)之后的工作.保留點(diǎn)主要作為一種調(diào)試手段使用.在一個(gè)事務(wù)中如果用相同的保留點(diǎn)名創(chuàng)建第二個(gè)保留點(diǎn),則前一個(gè)保留點(diǎn)被刪除掉,每個(gè)事務(wù)最大的活動(dòng)保留點(diǎn)由初始化參數(shù)文件中的參數(shù)SAVEPOINTS設(shè)定,極限值為255.,北京郵電大學(xué)軟件學(xué)院 郭文明 2003.06,數(shù)據(jù)庫(kù)設(shè)計(jì)與開發(fā)講義,3.2.5 ORACLE事務(wù)控制-語(yǔ)句,ROLLBACK WORK TO SAVEPOINT 保留點(diǎn)名; 清除本事務(wù)的全部保留點(diǎn),清除為執(zhí)行事務(wù)建立的封鎖機(jī)制,結(jié)束本事務(wù),回退數(shù)據(jù). 數(shù)據(jù)定義語(yǔ)句CREATE、DROP總引發(fā)提交,系統(tǒng)正常關(guān)閉時(shí),未提交事務(wù)將隱式提交,一個(gè)進(jìn)程或例程非正常終止,未提交事務(wù)將隱式回退。 SET TRANSACTION READ ONLY READ WRITE USE ROLLBACK S

溫馨提示

  • 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)論