根据业务规则,转账业务要么被全部执行,要么全部不执行,应如何保障?假设参与转账的账尸余额有大于等于。的约束,上述伪代码执行中可能出现什么情况,应如何处理?(100字以内) 若用SQL语句编写的转账业务事务程序如下: START TRANSACTIO

admin2009-01-10  28

问题 根据业务规则,转账业务要么被全部执行,要么全部不执行,应如何保障?假设参与转账的账尸余额有大于等于。的约束,上述伪代码执行中可能出现什么情况,应如何处理?(100字以内)
若用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;
   COMMIT;
   其中:Accounts为账户表,CurrentBalance为当前余额,Amount为新存入的金额。
   该事务程序能否保证数据的一致性?如不能,请说明原因并改正。(100字以内)

选项

答案不能实现,程序中第7行指令COMMIT为事务结束,此程序为两个事务,不满足转账业务要求。 修改方法:程序中第7行指令CONMIT删除即可。

解析 本题考查对事务并发控制概念及编程的掌握。
   事务是一个完整的业务逻辑处理,原子性要求是为了保证现实业务的正确执行。事务的开始通常是隐性的,上一事务结束后第一条SQL语句为事务开始,结束必须以 RollBack或Commit显示地标明。
   在并发状态下,可能会相互干扰破坏事务的ACID属性,加锁机制是保障事务正确执行的一种机制。
   2PL协议能够保证事务并发状态下调度的正确性,即可串行化的调度。其内容是:
   ①在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁;
   ②在释放一个封锁之后,事务不再申请和获得任何其他封锁。
   用伪代码描述,即在R()、W()操作之前分别加指令SLoek()和XLock,不再使用数据之后再解锁,且第一个解锁指令后不能再有加锁指令即可。
   在SQL编程中,使用标准SQL定义的隔离级别来实现事物并发执行下的一致性控制,4个隔离级别分别为Read Uncommitted、Read committed、Repeatable Read和 Serializable。
   问题3中的转账程序应为一个完整的现实业务,就满足原子性。而第7行COMMIT将程序分为了两个事务,不满足现实业务需求,去掉该行即可。
转载请注明原文地址:https://jikaoti.com/ti/2lN7FFFM
0

相关试题推荐
最新回复(0)