阅读下列说明,回答问题,将解答填入答题纸的对应栏内。 【说明】 某商业银行账务系统的部分关系模式如下: 账户表:Account(anso,aname,balance),其中属性含义分别为:账户号码、账户名称和账户余额。 交易明细表:Tran

admin2021-03-13  31

问题 阅读下列说明,回答问题,将解答填入答题纸的对应栏内。
【说明】
    某商业银行账务系统的部分关系模式如下:
    账户表:Account(anso,aname,balance),其中属性含义分别为:账户号码、账户名称和账户余额。
交易明细表:TranDetails(tno,ano,ttime,toptr,amount,ttype),其中属性分别为:交易编号、账户号码、交易时间、交易操作员、交易金额、交易类型(1-存款、2-取款、3-转账)。
    余额汇总表:AcctSums(adate,atime,allamt),其中属性分别为:汇总日期、汇总时间、总余额。
    常见的交易规则如下:
    存/取款交易:操作员核对用户相关信息,在系统上执行存/取款交易。账务系统增加/减少该账户余额,并在交易明细表中增加一条存/取款交易明细。
    转账交易:操作员核对用户相关信息,核对转账交易账户信息,在系统上执行转账交易。账务系统对转出账户减少其账户余额,对转入账户增加其账户余额,并在交易明细表中增加一条转账交易明细。
    余额汇总交易:将账户表中所有账户余额累计汇总。
    假定当前账户表中的数据记录如表5-1所示。

    请根据上述描述,回答以下问题。
假设在正常交易时间,账户上在进行相应存取款或转账操作时,要执行余额汇总交易。下面是用SQL实现的余额汇总程序,请补全空缺处的代码。要求(不考虑并发性能)在保证余额汇总交易正确性的前提下,不能影响其他存取款或转账交易的正确性。
    CREATE PROCEDURE ACCtsum(OUT:Amts DOUBLE)
    BEGIN
        SET TRANSACTION SOLATION LEVEL (a)________
        BEGIN TRANSACTION;
        SELECT sum(balance)  INTO  :Amts FROM Accounts;
        if error//error是由DBMS提供的上一句sQL的执行状态
        BEGIN
            ROLLBACK;
            return-2;
        END
        INSERT INTO AcctSums
            VALUES  (qetDATE(),geTIME(),(b)________);
        if error//error是由DBMS提供的上一句SQL的执行状态
        BEGTN
        ROLLBACK:
        return-3;
    END
    (c)________;
  END

选项

答案(a)SERIALIZABLE; (b):Amts; (c)COMMIT

解析 本问题考查数据库存储过程和事务隔离的基本概念。
    由于数据库总是被很多用户所共享,在数据库并发操作中,往往会出现数据的更新丢失、脏读、不可重复等问题。为了避免出现上面这三种情况,在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同:未提交读、提交读、可重复读取、串行化,其中串行化隔离级别提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
    根据问题1的题干描述和已给出的程序语句,可以看出该程序语句需要实现余额汇总事务的串行化操作,从而保证余额汇总交易数据正确性的前提下,不影响其他交易的正确性。
    因此空白(a)处应该填写SERIALIZABLE,表示当前事务设置为串行化隔离级别;空白(b)处应填写宿主变量:Amts,表示汇总余额:空白(c)处应填写COMMIT,表示事务正确结束时的提交操作。
转载请注明原文地址:https://kaotiyun.com/show/OrUZ777K
0

最新回复(0)