悆高级软件工程 网络环境中的软件质量21/197 如何面对错误? 在髙层(操作层)进行处理,保持系统的正确性、完整性 例如:银行转帐系统 B 从银行A的帐号a向银行B的帐号b转帐¥10000 (1)将A的帐号a中的金额减¥100 (2)将B的帐号b中的金额加¥100 该过程中任何一个环节都可能出错! 如何保证系统的可接受性?
高级软件工程 网络环境中的软件质量 21/197 如何面对错误? 在高层(操作层)进行处理,保持系统的正确性、完整性 例如:银行转帐系统 A B 从银行A的帐号a向银行B的帐号b转帐 ¥10000.00 (1)将A的帐号a中的金额减 ¥10000.00 (2)将B的帐号b中的金额加 ¥10000.00 该过程中任何一个环节都可能出错! 如何保证系统的可接受性?
悆高级软件工程 网络环境中的软件质量22/197 访问冲突 网络环境下存在各种资源: 处理器 存储器 外部设备 数据库 软件构件 为提高资源利用率,往往允许许多客户能够访问它们 当它们同时访问同一资源时,访问冲突即可能发生 例如: 更新丢失( lost updates) 不一致的读取( inconsistent retrieva)
高级软件工程 网络环境中的软件质量 22/197 访问冲突 网络环境下存在各种资源: 处理器 存储器 外部设备 数据库 软件构件 为提高资源利用率,往往允许许多客户能够访问它们 当它们同时访问同一资源时,访问冲突即可能发生 例如: 更新丢失(lost updates) 不一致的读取(inconsistent retrieval)
悆高级软件工程 网络环境中的软件质量23/197 更新丢失问题 存在3个银行帐号A、B、 帐面金额分别为:¥100,¥2000,¥3000 客户C1从帐号A向帐号B转¥400 客户C2从帐号C向帐号B转¥300 正常结束时帐号A减少¥400 帐号C减少¥300 帐号B增加¥700 假如C1、C2同时访问B(同时读取、写回B的金额 得到的结果可能是:帐号A减少¥400 帐号C减少¥300 帐号B增加¥400 C2的更新丢失了!
高级软件工程 网络环境中的软件质量 23/197 更新丢失问题 存在3个银行帐号A、B、C 帐面金额分别为:¥1000,¥2000,¥3000 客户C1 从帐号A向帐号B转 ¥400 客户C2 从帐号C向帐号B转 ¥300 正常结束时 帐号A减少 ¥400 帐号C减少 ¥300 帐号B增加 ¥700 假如 C1、C2 同时访问 B(同时读取、写回B的金额) 得到的结果可能是:帐号A减少 ¥400 帐号C减少 ¥300 帐号B增加 ¥400 C2的更新丢失了!
悆高级软件工程 网络环境中的软件质量24/197 客户C1:从帐号A向帐号B转¥400客户C2:从帐号C向帐号B转¥00 将帐号A上的金额减¥400 将帐号C上的金额减¥300 将帐号B上的金额加¥400 将帐号B上的金额加¥300 Balance: =A reado ¥1000 A write(balance-400) 5600 balance: =C reado ¥3000 C write(balance-300) Y 2700 balance: =B reado ¥2000 balance: =B reado ¥2000 B write(balance+300) Y 2300 B write(balance 400) 52400 结果:客户C2的更新操作被丢失
高级软件工程 网络环境中的软件质量 24/197 客户C1:从帐号A向帐号B 转 ¥400 将帐号A上的金额减 ¥400 将帐号B上的金额加 ¥400 客户C2:从帐号C向帐号B 转 ¥300 将帐号C上的金额减 ¥300 将帐号B上的金额加 ¥300 Balance:=A.read() ¥1000 A.write(balance -400) ¥600 balance:=C.read() ¥ 3000 C.write(balance-300) ¥ 2700 balance:=B.read() ¥2000 balance:=B.read() ¥ 2000 B.write(balance + 300) ¥ 2300 B.write(balance + 400) ¥2400 结果:客户C2的更新操作被丢失
悆高级软件工程 网络环境中的软件质量25/197 不一致的读取问题 存在3个银行帐号A、B、 帐面金额分别为:¥1000,¥2000,¥3000 客户C1从帐号A向帐号B转¥400 客户C2计算三个帐号的总额 正常结束时总额为¥6000 假如C1、C2同时操作 得到的结果可能是: 总额为¥5600 总额计算错误!
高级软件工程 网络环境中的软件质量 25/197 不一致的读取问题 存在3个银行帐号A、B、C 帐面金额分别为:¥1000,¥2000 ,¥3000 客户C1 从帐号A向帐号B转 ¥400 客户C2 计算三个帐号的总额 正常结束时 总额为 ¥6000 假如 C1、C2 同时操作 得到的结果可能是: 总额为 ¥5600 总额计算错误!