专栏首页测试技术圈事务注解(@Transactional)引起的数据覆盖故障

事务注解(@Transactional)引起的数据覆盖故障

一、故障现象

车辆交付履约流程上两个节点(工程项目)A和B, A修改一条数据记录item(工单),然后发消息给B,B也会对item进行修改。

故障现象,有时候(不是必现)感觉A没有成功修改item这条数据,而日志显示A修改成功了数据item!

看一下具体代码实现。下图是工程A代码,3个红框依次动作。

1、开启事务

2、修改工单记录item

3、向下游节点发送mq消息

下图是下游消费mq消息的节点B,红框表示采用JPA技术修改数据记录item

二、原因分析

这个过程总共经历5个步骤,见下图

1、节点A开启一个事务,修改数据表中某条数据item

2、A向B发送mq消息,再做些其他事情,提交事务

3、节点B,消费mq消息

4、节点B读出数据item

5、节点B在内存中修改数据item某些字段,写回数据库

注意到第1、2步骤是在一个事务中。存在一种可能,B节点收到mq消息,执行第4步骤,读取item数据后,步骤1、2的事务才完成提交。由于数据库事务隔离级别,这种情况下,第4步骤读到的数据并不是A节点在第1步写的,已经读到脏数据了。当第5步写回数据的时候,就可能造成老数据覆盖A写的新数据。

这里有两个细分场景

1、第1步、第5步修改同一个字段。这种情况,第4步骤读到脏数据

2、第1步、第5步修改不同字段。第4步读到col2字段的oldvalue,第5步目的是修改col3的值,但是采用jpa或者mybatis的一些默认写法,会把col2的oldvalue更新回数据库。

一般的ORMapping框架利用一个vo对象写数据库记录,没有修改的字段不会更新(代码里并没有改col2的值),但是第4步读取数据后,第1步对数据item进行了修改。这样默认的写库方法,会check记录的变化,然后把col2字段的值更新。这样就出现了旧值覆盖新值的问题。

三、解决办法

1、考虑到实施成本,如果修改不同的字段,不存在竞争关系。只需要在第5步写库的环节指定更新字段就能快速解决这个问题。事实上,生产环境下也是选择的这个方案临时修复。

2、解决办法1显然不够优秀。更好的做法,把第2步发mq消息从事务中拆出来,等第1步操作commit后在发mq消息。这个办法涉及到一些逻辑的梳理(业务代码里会有不少的if……else),代码的改动。这样处理仍然不够完美,第1步执行完了,第2步失败了怎么办?在这里可能需要一些额外的代码工作保证第2步执行成功。

3、如果业务压力不大,也可以考虑从数据库的事务隔离级别方面入手来解决这个问题。

4、业务上,第1步到第5步如果需要强一致,了解一下分布式事务

本文分享自微信公众号 - V社 北京社(SoftwareTesters)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 大数据测试——完整的软件测试初学者指南

    大数据测试,在当前的测试领域是一个相对比较新的领域,而且难度也非常大。大数据测试从某种意义来说和人工智能测试有点类似,测试数据的量比较大,而test oracl...

    Criss@陈磊
  • Docker 容器连接

    这样我们就可以通过访问 127.0.0.1:5001(主机) 来访问容器的 5000 端口。这里面默认都是绑定TCP要绑定UDP如下命令:

    Criss@陈磊
  • Web压力测试工具webbench

    int method = METHOD_GET; //默认请求方法为GET方式

    Criss@陈磊
  • 业余时间学数据分析,如何快速上手

    数据正在变得越来越常见,小到我们每个人的社交网络、消费信息、运动轨迹……,大到企业的销售、运营数据,产品的生产数据,交通网络数据……

    刀刀老高
  • 业余时间学数据分析,如何快速上手

    谷歌的数据分析可以预测一个地区即将爆发的流感,从而进行针对性的预防;淘宝可以根据你浏览和消费的数据进行分析,为你精准推荐商品;口碑极好的网易云音乐,通过其相似性...

    Crossin先生
  • 【思维】如何把“数据”转化成可以行动的“信息”

    题目中的这个问题,我理解是个本质。在数据时代,数据不管从哪里获取、用什么工具获取,也不管数据规模是否够得上是“大数据”,也不管你用来分析和利用这些数据的是BI软...

    CDA数据分析师
  • 【陆勤阅读】大数据思维的十大原理:当样本数量足够大时,你会发现其实每个人都是一模一样的

    大数据思维原理是什么?可以概括为10项原理。 一、数据核心原理 从“流程”核心转变为“数据”核心 大数据时代,计算模式也发生了转变,从“流程”核心转变为“数据”...

    陆勤_数据人网
  • 【陆勤阅读】从经典数据案例看面对大数据我们如何去驾驭?

    大数据掀起的革命,正在全面影响你我的生活。面对如此大量数据,该怎麽用?如何正确解读?国外企业成功经验,可以做为借鉴。   一场大数据分析的「数据革命」登场,正掀...

    陆勤_数据人网
  • 【数据科学】大数据思维的十大原理:当样本数量足够大时,你会发现每个人都是一模一样的

    大数据思维原理是什么?笔者概括为10项原理。 一、数据核心原理 从“流程”核心转变为“数据”核心 大数据时代,计算模式也发生了转变,从“流程”核心转变为“数据”...

    陆勤_数据人网
  • 首席数据官应该讲什么“基本法”?

    这是一个人人都谈大数据的时代,尤其对很多企业来说,数据已是议事日程上的当务之急。首席数据官(CDO)这一新兴职位就在这样一种背景下越发壮大。但问题是,首席数据官...

    DT数据侠

扫码关注云+社区

领取腾讯云代金券