问答题
阅读下列说明,根据要求回答问题。 [说明] 某银行的转账业务分为如下两类操作。 (1)读取账户A余额到变量x,记为x=R(A)。 (2)将变量x值写入账户A中的余额,记为W(A,x)。 从账户A向账户B转账金额x元的伪代码操作序列为:a=R(A),a=a-x,W(A,a),b=R(B),b=b+x,W(B,b)。 针对上述业务及规则,完成下列问题。
问答题
根据业务规则,转账业务要么被全部执行,要么全部不执行,应如何保障? 假设参与转账的账户余额有大于等于0的约束,上述伪代码执行中可能出现什么情况?应如何处理?请用100字以内的文字进行阐述。
【正确答案】 这是一道要求读者掌握事务基本概念及其应用的综合分析题,本题的解答思路如下。 根据银行业务规则,转账业务要么被全部执行,要么全部不执行。事务是一个完整的业务逻辑处理,原子性要求是为了保证现实业务的正确执行。若将转账业务作为一个完整的事务,则能保障其所有操作要么全部执行,要么全部不执行。 从账户A向账户B转账金额x元的伪代码操作序列为:a=R(A),a=a-x,W(A,a),b=R(B),b=b+x,W(B,b)。假设参与转账的账户余额有大于等于0的约束,当A账户金额小于转账金额x时,转账过程中会因为其余额小于0而违反该约束,不能被执行。此时需要回滚事务,转账业务不能被执行。
【答案解析】
问答题
若允许对同一账号同时进行转账,要保证转账程序的并发执行,引入共享锁指令SLock(b)和独占锁指令xLock(A)对数据A进行加锁,解锁指令Unlock(A)对数据A进行解锁。 请补充上述转账业务的伪代码序列,使其满足2PL协议。
【正确答案】 这是一道要求读者掌握2PL协议实际应用的综合理解题,本题的解答思路如下。 在并发状态下,可能会相互干扰破坏事务的ACID属性,加锁机制是保障事务正确执行的一种机制。2PL协议能够保证事务并发状态下调度的正确性,即可串行化的调度。其内容: ·在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。 ·在释放一个封锁之后,事务不再申请和获得任何其他封锁。 若允许对同一账号同时进行转账,要保证转账程序的并发执行,引入共享锁指令SLock(B)和独占锁指令XLock(A)对数据A进行加锁,解锁指令Unlock(A)对数据A进行解锁。用伪代码描述,即在R()、W()操作之前分别加指令SLock()和XLock,不再使用数据之后再解锁,且第一个解锁指令后不能再有加锁指令。对于题干中转账业务的伪代码序列,使其满足2PL协议的伪代码程序如下。 XLock(A),a=R(A),a=a-x,W(A,a),XLock(B),b=R(B),b=b+x,W(B,b),Unlock(A),Unlock(B)
【答案解析】
问答题
若用SQL语句编写的转账业务事务程序如下。 START TRANSACTION; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE UPDATE Accounts SET CurrentBalance=CurrentBalance - Amount WHERE AccountID=A; if error then ROLLBACK; COMMIT; UPDATE Accounts SET CurrentBalance=CurrentBalance + Amount WHERE AccountID=B; if error then ROLLBACK; CONMIT; 其中:Accounts为账户表,CurrentBalance为当前余额,Amount为新存入的金额。 该事务程序能否保证数据的一致性?如不能,请说明原因并改正。请用100字以内的文字进行阐述。
【正确答案】 这是一道要求读者掌握2PL协议理论与SQL中的隔离级别,以及嵌入式SQL的编程实践题,本题的解答思路如下。事务的开始通常是隐性的,上一事务结束后第一条SQL语句为事务开始,结束必须以RollBack或Commit显式地标明。在嵌入式SQL编程中,使用标准SQL定义的隔离级别来实现事物并发执行下的一致性控制,4个隔离级别分别为Read Uncommitted、Read committed、Repeatable Read和Serializable。 此题中的转账程序应为一个完整的现实业务,就满足原子性。而第7行COMMIT将程序分为了两个事务,不满足现实业务需求,删除该行即可。
【答案解析】
提交答案
关闭