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

【問題3】 (6分)
(a) return
(b) 商品ID=:MID
(c) COMMIT
答案















