【說明】
某網(wǎng)上商品銷售系統(tǒng)的業(yè)務(wù)流程如下:
(1)將客戶的訂單記錄(訂單號(hào),客戶ID,商品ID,購買數(shù)量)寫入訂單表;
(2)將庫存表(商品ID,庫存量)中訂購商品的庫存量減去該商品的購買數(shù)量。
針對(duì)上述業(yè)務(wù)流程,完成下列問題:
【問題1】(3分)
假設(shè)庫存量有大于等于O的約束,可能出現(xiàn)如下情況:當(dāng)訂單記錄寫入訂單表后,修改庫存表時(shí)因違法約束而無法執(zhí)行,應(yīng)如何處理?(100字以內(nèi))
【問題2】(6分)
引入如下偽指令:將商品A的訂單記錄插入訂單表記為I(A);讀取商品A的庫存量到變量x,記為x=R(A);變量x值寫入商品A中的庫存量,記為W(A,x)。則客戶i的銷售業(yè)務(wù)偽指令序列為:Ii(A),xi=Ri (A),xi=xi-ai,Wi (A,Xi)。其中ai為商品的購買數(shù)量。
假設(shè)當(dāng)前庫存量足夠,不考慮發(fā)生修改后庫存量小于0的情況。若客戶1、客戶2同時(shí)購買同一種商品時(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)什么問題(100字以內(nèi))?
(2)為了解決上述問題,引入共享鎖指令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í)間最短。
【問題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);
If error then {ROLLBACK; (a) ;}
UPDATE庫存表
SET庫存量=庫存量-:qty
WHERE (b) ;
If error then {ROLLBACK; return;}
(c)