請(qǐng)教:2011年上半年數(shù)據(jù)庫(kù)系統(tǒng)工程師下午試卷(參考答案版)第1大題第5小題如何解答?
【題目描述】
試題五(共15分)
閱讀下列說(shuō)明,回答問(wèn)題1至問(wèn)題3,將解答填入答題紙的對(duì)應(yīng)欄內(nèi)。
【說(shuō)明】
某網(wǎng)上商品銷售系統(tǒng)的業(yè)務(wù)流程如下:
(1)將客戶的訂單記錄(訂單號(hào),客戶ID,商品ID,購(gòu)買數(shù)量)寫(xiě)入訂單表;
(2)將庫(kù)存表(商品ID,庫(kù)存量)中訂購(gòu)商品的庫(kù)存量減去該商品的購(gòu)買數(shù)量。針對(duì)上述業(yè)務(wù)流程,完成下列問(wèn)題:
【問(wèn)題1】(3分)
假設(shè)庫(kù)存量有大于等于O的約束,可能出現(xiàn)如下情況:當(dāng)訂單記錄寫(xiě)入訂單表后,
修改庫(kù)存表時(shí)因違法約束而無(wú)法執(zhí)行,應(yīng)如何處理?(100字以內(nèi))
【問(wèn)題2】(6分)
引入如下偽指令:將商品A的訂單記錄插入訂單表記為I(A);讀取商品A的庫(kù)存量到變量x,記為x=R(A);變量x值寫(xiě)入商品A中的庫(kù)存量,記為W(A,x)。則客戶i的銷售業(yè)務(wù)偽指令序列為:Ii(A),xi=Ri(A),xi=xi-ai,Wi(A,Xi)。其中ai為商品的購(gòu)買數(shù)量。
假設(shè)當(dāng)前庫(kù)存量足夠,不考慮發(fā)生修改后庫(kù)存量小于o的情況。若客戶1、客戶2同時(shí)購(gòu)買同一種商品時(shí),可能出現(xiàn)的執(zhí)行序列為:I1(A),I2(A),X1=R1(A),X2= R2(A),x1= x1-a1, W1(A, xi), X2=X2- a2, W2(A,X2)。
(1)此時(shí)會(huì)出現(xiàn)什么問(wèn)題(100字以內(nèi))?
(2)為了解決上述問(wèn)題,引入共享鎖指令SLock(A)和獨(dú)占鎖指令XLock(A)對(duì)數(shù)據(jù)
A進(jìn)行加鎖,解鎖指令Unlock(A)對(duì)數(shù)據(jù)A進(jìn)行解鎖,客戶i的加鎖指令用SLocki(A)表示,其它類同。插入訂單表的操作不需要引入鎖指令。請(qǐng)補(bǔ)充上述執(zhí)行序列,使其滿足2PL協(xié)議,并使持有鎖的時(shí)間最短。
【問(wèn)題3】(6分)
下面是用E-SQL實(shí)現(xiàn)的銷售業(yè)務(wù)程序的一部分,請(qǐng)補(bǔ)全空缺處的代碼。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
INSERT INTO 訂單表VALUES(:OID,:CID,:MID,:qty);
iferror then {ROLLBACK;(a);}
UPDATE庫(kù)存表
SET庫(kù)存量=庫(kù)存量-:qty
WHERE(b);
iferror then {ROLLBACK; return;}
(c)
【我提交的答案】:
【參考答案分析】:
試題五參考答案(共15分)
【問(wèn)題1】(3分)
將寫(xiě)訂單記錄和修改庫(kù)存表做為一個(gè)完整的事務(wù)來(lái)處理,當(dāng)修改庫(kù)存表無(wú)法執(zhí)行時(shí),回滾事務(wù),則會(huì)撤銷寫(xiě)入的訂單記錄,數(shù)據(jù)庫(kù)保持一致。
【問(wèn)題2】(6分)
(1)出現(xiàn)問(wèn)題:客戶購(gòu)買后寫(xiě)入的庫(kù)存量值被覆蓋,庫(kù)存量不能體現(xiàn)客戶1已購(gòu)買,屬于丟失修改造成的數(shù)據(jù)庫(kù)不一致性。
(2)重寫(xiě)后的序列:
【問(wèn)題3】 (6分)
(a) return
(b) 商品ID=:MID
(c) COMMIT