【说明】
某网上销售系统的部分关系模式如下 :
订单表: orders(o_no, o_dat e, o_time, p_no, m_no, p_price, nums, amt, stat us) , 其中属性含义分别为: 订单号、订单日期、订单时间、产品编码、供应商编码、产品价格、产品数量、订单金额、订单状态 ( 0-未处理、1- 己处理、 2-已取消)。
产品表: products(p_no, p_nam e, p_type, price, m_no, p_nums) , 其中属性含义分别为 : 产品编码、产品名称、产品类型、产品价格、供应商编码、库存数量。
【问题1】(5分)
节假日时, 由供应商提供商品打折后的新价格, 数据存放在临时表中, 该临时表的表名为 tmp_prices ( 不同供应商有不同的临时表 ), 其关系模式如下:
tmp_prices(p_no,t_price,m_no);
后台维护人员需要根据供应商填写在 tmp_prices 中的数据来更新产品表中某些产品的价格。下面是基千游标 , 用 SQL 实现的价格更新程序, 请补全空缺处的代码。
CREATE PROCEDURE UpdatePrice()
DECLARE
Pno VARCHAR(lO);
Pprice real(6,2);
Mno VARCHAR(lO);
( a ) upPrice IS
SELECT p_no, t_price, m_no FROM tmp_prices;
BEGIN
( b ) upPrice;
LOOP
FETCH upPrice INTO
IF NOTFOUND DO BREAK / / FETCH 操作无数据
UPDATE products SET price= Pprice WHERE p_no = Pno and m_no=Mno;
If error / / error 是由 DBM S 提供的上一句 SQL 的执行状态
BEGIN
ROLLBACK;
RETURN -1;
END END LOOP
CLOSE upPrice;
( d ) ;
END;
【问题 2】
假设用户 1 和用户 2 同时购买 1 份 A 商品, 用户 3 查询和浏览 A 商品。三个用户对应事务的部分调度序列如表 4-1 所示(事务中未进行并发控制), 其中 TO 时刻 A 商品的库存数量 p_nums 为 100。
请说明 T4、T7 时刻, 用户 3 事务读取到的 p_nums 数值分别是多少。请说明 T8 时刻事务调度结果是否正确? 若不正确请说明属千哪一种数据不一致性。
【问题 3】( 4 分)
为保证并发事务的正确性, 系统要求所有事务需遵循两段锁协议。
1 ) 请简要解释两段锁协议 , 并说明“ 两段” 的含义。
2 ) 请说明两段锁协议是否可以避免死锁? 如不能避免,应采取什么措施解决死锁问题。