我们的发货单在审核时,要在发货单明细所对应的业务记录中登记发货单号,这样用户在查看业务记录中可以直接看到该业务记录是在哪一个发货单中发出的。

前几天客户报告了一个Bug,业务数据在审核发货后,发货单号没有设置;但是单据已经成功地审核了;这个Bug是偶尔才会出现的,出现条件不明,找了很久都没有找到原因。

前几天想了一个笨办法,把一个出这样问题的数据库的LOG文件Tranlate成了SQL脚本,然后在脚本中查找出问题的业务单据和对应的发货单做过哪些修改,最后终于找到了问题的原因所在,原来就是对事务的控制不正确造成的。

在系统的早期版本中,发货单的审核是专门通过一个函数来实现的,在这个函数中完成将发货单据设置为已审核、修改库存等操作,并在函数中进行了判断,成功则Commit否则Rollback,而在“审核”按钮的Click事件中则仅仅判断是否审核成功,不成功则退出;

这样做本来没有什么问题,但是在原有的开发人员离开后,接手的程序员没有很好地理解原有系统的设计架构,对于“审核后要设置业务单据的发货单号”这个功能写在“审核”按钮的Click事件中了,这样审核操作就被分成了两个事务了,而且一个很糟糕的问题是在新增加的这段程序中没有进行Commit!于是“审核后要设置业务单据的发货单号”这个操作是否会被提交就只能看用户在审核后会做些什么操作了,一般情况下都会提交的(我猜是在窗口直接关闭时提交的),但是如果用户在审核后添加一条新单据,然后取消,那么这个操作就会被Rollback了(取消中有Rollback),这样就会造成前面所说的Bug。

吸取的教训:
1.首先是事务的提交不应该放在函数中,函数中应该仅仅进行逻辑的判断,并返回是否成功,而对函数功能的返回结果进行检测,并对事务进行管理是事件的任务,这样即使在事件中有多个函数调用,也能够保证一个事件中只有一个事务;
2.今天看《CSDN开发高手》上的一篇文章,里面讲到在事件中不应该存放任何业务逻辑,业务逻辑都应该以单独的方法或函数进行封装,而在事件中应该只是调用并检测返回值,而不应该在事件中直接写业务逻辑,对照这次的问题,深以为然;
3.在事件中对数据库的操作完成后一定要对事务进行处理;
4.一定要有文档、明确的注释或者自注释性好的程序,详细的并且和程序完全同步的文档很难做到,那么就尽量的把程序的注释写好,这样可以保证后续的开发人员可以理解以前的设计思路;

回头要把1、2、3三条加到开发规范中。

遇到一个由于事务控制不当造成错误的Bug相关推荐

  1. SpringBoot(配置druid数据源、配置MyBatis、事务控制、druid 监控)

    SpringBoot 得到最终效果是一个简化到极致的 WEB 开发,但是只要牵扯到 WEB 开发,就绝对不可能缺少 数据层操作,所有的开发都一定秉持着 MVC 设计模式的原则,MVC 里面业务层不可少 ...

  2. t-sql中的事务控制及错误处理

    ------------------------------------------------事务控制------------------------------------------------ ...

  3. 十一、总结一下今天在SpringAOP中遇到的一个坑,事务控制一直失败,自己感觉代码没错的感觉,往底层看,很明了了

    今天晚上找bug找了很久,是一个关于QueryRunner的 我找了很久都无法进行事务控制,后来我想到了数据源会产生不同的连接,从query方法点进去可以看到 继续点开 发现没有,每次都会产生一个新的 ...

  4. 在C#中使用COM+实现事务控制

    .NET技术是微软大力推广的下一代平台技术,自从.NET技术架构的正式发布,此项技术也逐渐走向成熟和稳定.按照微软的平台系统占有率,我们不难想象得到,在未来的一两年内.NET技术必定会势如破竹一般的登 ...

  5. redis事务不具有回滚机制,那么它是如何进行事务控制的

    redis事务 任何数据库都要有一套自己的事务控制机制,redis事务是一次可以执行多个命令,它的本质是一组命令的集合.一个事务中所有的命令都会被序列化,在事务执行的过程中会按照顺序执行队列中的命令. ...

  6. controller的异常处理以及service层的事务控制___controller层 trycatch不影响service层抛出的异常

    controller的异常处理以及service层的事务控制 最近写代码涉及到一些事务,上午终于把代码给理顺了,之前不太清楚在哪里做异常处理,导致代码遍地try-catch,相当难看. 还是基于con ...

  7. MySQL索引创建、删除及事务控制

    文章目录 一.索引概述 二.索引的优点与缺点 三.创建索引的原则依据 四.索引的分类与创建 4.1 索引的分类 4.2 索引的创建 4.2.1 普通索引 4.2.2 唯一索引 4.2.3 全文索引 4 ...

  8. Spring中的事务控制

    Chapter 1. Spring中的事务控制(Transacion Management with Spring) Table of Contents 1.1. 有关事务(Transaction)的 ...

  9. Spring中的事务控制(Transacion Management with Spring)

    1.1. 有关事务(Transaction)的楔子 1.1.1. 认识事务本身1.1.2. 初识事务家族成员 1.2. 群雄逐鹿下的Java事务管理 1.2.1. Java平台的局部事务支持1.2.2 ...

最新文章

  1. 自旋表达的到底是什么?
  2. 【NLP傻瓜式教程】手把手带你CNN文本分类(附代码)
  3. java rmi jrmp_关于Java 中 RMI、JNDI、LDAP、JRMP、JMX、JMS那些事儿(上)看后的一些总结-1...
  4. redis——命令请求的执行过程
  5. mplab x ide 中文使用手册_中文文档:MPLAB ICD 4在线调试器用户指南
  6. linux 列出当前视频设备,如何获取Linux(ubuntu)上的视频捕获设备(网络摄像机)列表?(C / C ++)...
  7. malloc 和free设计
  8. Pytorch——回归问题
  9. linux下配置防火墙
  10. ejs 基础语法教程
  11. 设计一个序列信号发生器, 产生序列信号1011101. 用74LS161和4选1数据选择器74153及必要的门电路实现
  12. 安装rtl8187时出现2.6.32-358.el6.i686/build错误
  13. 【AI撬动地球】超级大国政治将让位于跨国AI巨头
  14. pytorch实现GAN
  15. 在手机与计算机之间进行文件传输的方式,电脑与手机快速传输文件的方法
  16. 多任务学习综述:推荐系统多任务学习(multitask)的实战总结和常见问题(一)
  17. 如何对电脑屏幕进行监控?
  18. 求职信计算机工程师英语,工程师英文求职信
  19. No executable code found at line。。。
  20. ios apple语音性别_iOS 14:Apple终于听了

热门文章

  1. mysql中enum类型
  2. python中字符串格式化
  3. 某企业WSUS服务实例介绍
  4. [转载]在SQL Server数据库之间进行数据导入导出,OPENDATASOURCE
  5. 传承德艺之馨——上海文联第八次代表大会侧记
  6. 你以为你真的了解final吗?
  7. 企业级Nginx服务基础到架构优化详解--25条
  8. SharePoint 2016 必备组件离线安装介绍
  9. hadoop2.610集群配置(包含HA和Hbase )
  10. StoreFront 2.5让XenDesktop和XenApp如虎添翼