工行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 事务的回顾 什么是事务 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么 ...
随机推荐
- Windows内网渗透提权的几个实用命令
1.获取操作系统信息 查看所有环境变量:set 识别系统体系结构:echo %PROCESSOR_ARCHITECTURE% AMD64 识别操作系统名称及版本:systeminfo 查看某特定用户 ...
- 在SQL Server中将数据导出为XML和Json
有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...
- 创建第二个 local network - 每天5分钟玩转 OpenStack(84)
GUI 中有两个地方可以创建 network: 1. Project -> Network -> Networks 这是普通用户在自己的 tenant 中创建 network 的地方. 2 ...
- 苹果系统安装虚拟机 Mac如何安装虚拟机教程
1.前言 大家在用 Mac 系统的时候,可能有时难免还是要用到 Windows 系统.在 Mac 上使用 Windows 系统有二种方法.一种是在 Mac上安装双系统,适合要在机器上处理一些大型 ...
- 如何利用Python生成随机密码
写了个程序,主要是用来检测MySQL数据库的空密码和弱密码的, 在这里,定义了三类弱密码: 1. 连续数字,譬如123456,在get_weak_num中实现 2. 连续字母,譬如abcdef,在ge ...
- Oracle层次查询
Oracle层次查询的语法如下: 下面根据两道“烧脑”的题具体来体现: 1. 根据时间先后顺序,十二星座的英文名称用逗号串起来为'Aries,Taurus,Gemini,Cancer,Leo,Virg ...
- ASP.NET 字符编码的那些事
ASP.NET 中的字符编码问题,一般会有两个场景: HTML 编码:一般是动态显示 HTML 字符或标签,写法是:HttpUtility.HtmlDecode(htmlString) 或 Html. ...
- [Keras] Install and environment setting
Documentation: https://keras.io/ 1. 利用anaconda 管理python库是明智的选择. conda update conda conda update anac ...
- Oracle内存管理技术
1.Oracle内存管理技术 2.配置自动内存管理(AMM) 3.监视自动内存管理(AMM) 4.配置自动共享内存管理(ASMM) 5.配置自动PGA内存管理 Reference 1.Oracle内存 ...
- JavaScript代码模块化的正规方法
RequireJS-CommonJS-AMD-ES6 Import/Export详解 为什么起了一个这个抽象的名字呢,一下子提了四个名词分别是:RequireJS,CommonJS,AMD,ES6,答 ...