工行ATM转账——事务操作
今儿去工行ATM给已朋友转账,遇到这么个情况:
选择对外转账后输入转入账号(输入两次),接着提示输入转入金额(输入一次金额),按确定,系统提示交易中,3秒左右,
提示“输入账号无效”,系统自动中断了操作,回到了初始界面,我勒个去,只好退卡,再试一次结果还是一样,最后只好打电话
和朋友确定账号,原来账号颠倒了俩个数字,汗死;再次去ATM操作转账,转账成功,我梳理下这个转账流程(省略插卡,输入密码步骤):
1,选择转账
2,选择转账类型(对外,对内,币中)
3,输入两次转入账号
4,输入一次转入金额,按“确定”按钮
5,系统开始交易(自动),约 3~5秒出现提示“转入,xxx号xxx金额”
6,提示成功(自动)流程结束
这里忽略异常处理,从这个流程中可以看出有这么2个问题,
1,输入两次账号后并没有真实验证输入账号的有效性(这两次1,2次仅是验证了账号是否一致)这个验证可能放到了后面”确定“按钮后,我的理由是这里操作很快体系也没有等待现象,主要是最后的交易中提示了“转入账号无效”的提示
2,输入金额后,点击”确定“后,开始交易,最后提示“转入,xxx号xxx金额”,系统自动就完成了转账过程,并没有再次提示
“转入,xxx号xxx金额”让用户最终确认,如果这里输入错误且有效的卡号,那钱就转到别人账号中取了,岂不杯具鸟,这里所有验证都是在输入金额按”确认“后进行(转出,转入验证等),看似简化了操作,其实前面做了一大堆的操作,最后流程(如果异常)整个操作就失败了,系统做无用功
,客户也做无用功,我猜测在按”确定“后,操作应该进入了事务阶段,这里有任何异常,都会退出或者回滚。也就说,这个事务阶段很“长”
个人认为,
1,输入两次账号后,系统应该验证账号(背后也要验证转出账号是否合法)的合法性,这里并不需要事务,合法则往下操作,否则中断操作,引导用户返回操作(不要系统自动返回并结束流程)
2,在输入转入金额后,提示”转入xxx账号xxx金额“,这里应该让用户“确认”,这里也不需要事务
3,最后在用户按”确定“按钮后再开始转账,这里开始事务
4,其他步骤一样
这里有两个验证一个是系统验证账号的合法性另一个是用户看到”转入xxx账号xxx金额“确定操作后,而不是输入金额后“确定”(这里看不到”转入xxx账号xxx金额“,最后系统倒提示了“转入xxx账号xxx金额”这个时候用户是没有任何操作权的),系统开始正式转账到这里所有条件都具备了(不要把准备工作放入事务,只把必要的操作放入事务),好处是,缩短事务范围,让用户最终确定转账(也可以在输入两次账号后让用户确定转入账号,这样用户有两次决定权,而不是一次决定权)
工行ATM转账——事务操作的更多相关文章
- 使用JDBC进行数据库的事务操作(2)
本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...
- 使用JDBC进行数据库的事务操作(1)
本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作.下一篇会讲述如何使用JDBC进行数据库的事务操作. 事务是指数据库中的一组逻辑操作,这个操作的特点就是在该组逻辑 ...
- MongoDB模拟多文档事务操作
Mongodb不支持多文档原子性操作,因此依据两阶段提交协议(Two Phase Commits protocol)来模拟事务. 以两个银行账户之间的转账行为为例,来说明如何实现多文档间的事务操作. ...
- Django 事务操作
如何在Django中进行事务操作 案例: 客户A要给客户B转一笔钱,这个在数据库中需要进行两步: 1.客户A减钱 2.客户B加钱 如果在第一步结束后,服务器出现异常,停下了,第二步没有进行,如果数据库 ...
- Java框架spring学习笔记(十七):事务操作
事务操作创建service和dao类,完成注入关系 service层叫业务逻辑层 dao层单纯对数据库操作层,在dao层不添加业务 假设现在有一个转账的需求,狗蛋有10000元,建国有20000元,狗 ...
- Spring中的事务操作
事务的特性 原子性:强调事务的不可分割. 一致性:事务的执行的前后数据的完整性保持一致. 隔离性:一个事务执行的过程中,不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数据库. 如果不 ...
- Spring 中的事务操作、注解、以及 XML 配置
事务 事务全称叫数据库事务,是数据库并发控制时的基本单位,它是一个操作集合,这些操作要么不执行,要么都执行,不可分割.例如我们的转账这个业务,就需要进行数据库事务的处理. 转账中至少会涉及到两条 SQ ...
- Django中-事务操作
如何在Django中进行事务操作呢? 近期,公司里要使用Django开发一套金融相关的系统. 涉及钱了.....安全安全安全 如果钱转到一半,系统崩了,咋办? 如果钱汇到一半,系统崩了,咋办? 如果东 ...
- (转)Spring中的事务操作
http://blog.csdn.net/yerenyuan_pku/article/details/70024364 事务的回顾 什么是事务 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么 ...
随机推荐
- Eos开发——ajax请求
function saveData(){ form.validate(); if(form.isValid()==false) return; var persons = grid.getChange ...
- mybatis的一些小总结
好长时间没用mybatis了,现在项目忽然用mybatis,用的过程中出现了些问题,虽然解决了,不过这花的时间有些长了.总结用的过程中出现的一些问题 1.mapper.xml 之前一直用的自动生成,现 ...
- meta标签中的http-equiv属性使用介绍(转载)
meta是html语言head区的一个辅助性标签.也许你认为这些代码可有可无.其实如果你能够用好meta标签,会给你带来意想不到的效果,meta标签的作用有:搜索引擎优化(SEO),定义页面使用语言, ...
- 异步方法不能使用ref和out的解决方法
异常处理汇总-后端系列:http://www.cnblogs.com/dunitian/p/4523006.html 应用场景==>后端现在都是用异步方法,那么分页是必不可少的,于是就有了这个问 ...
- C#设计模式系列:迭代器模式(Iterator)
迭代器模式把对象的职责分离,职责分离可以最大限度减少彼此之间的耦合程度,从而建立一个松耦合的对象.职责分离的要点是对被分离的职责进行封装,并以抽象的方式建立彼此之间的关系. 1.迭代器模式简介 1.1 ...
- Hawk 3.1 动态页面,ajax,瀑布流
不少朋友反映,Hawk的手气不错,好像没法处理动态页面.其实很容易,比其他软件都容易,让我慢慢道来. 1. 什么是动态页面 很多网站,在刷新的时候会返回页面的全部内容,但实际上只需要更新一部分,这样可 ...
- iOS开发之手势识别
感觉有必要把iOS开发中的手势识别做一个小小的总结.在上一篇iOS开发之自定义表情键盘(组件封装与自动布局)博客中用到了一个轻击手势,就是在轻击TextView时从表情键盘回到系统键盘,在TextVi ...
- canvas学习笔记
html5的新标签:canvas; 作用:标签定义图形,比如图表和其他图像:标签只是图形容器,您必须使用脚本来绘制图形.默认大小:宽300px,高150px; 背景知识:概念最初由苹果公司提出的,用于 ...
- EntityFramework 外键值映射
如果在 EF OnModelCreating 中配置了实体外键映射,也就是 SQL Server 中的 ForeignKey,那么我们在添加实体的时候,主实体的主键值会自动映射到子实体的外键值,并且这 ...
- 站在巨人的肩膀上---重新自定义 android- ExpandableListView 收缩类,实现列表的可收缩扩展
距离上次更新博客,时隔略长,诸事繁琐,赶在去广州答辩之前,分享下安卓 android 中的一个 列表收缩 类---ExpandableListView 先上效果图: 如果想直接看实现此页面的代码请下滑 ...