前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >事务可重复读采坑

事务可重复读采坑

作者头像
老梁
发布2019-09-30 15:54:17
4920
发布2019-09-30 15:54:17
举报
文章被收录于专栏:Java工程师成长之路

1. 事务可重复读采坑

1.1. 问题

  1. 今天碰到个事务幻读的情况,不容易啊,这不是事务间造成的问题,而是rpc调用产生的问题,实际上业务比较规范也不会出现这样的问题。
  2. 具体情况是系统A方法a开启required事务,在事务方法中rpc调用了系统B,生成了一条订单,而之后系统A又用sql查询了这条订单,会发现根本查不到

1.2. 原因

  • 通过select @@tx_isolation;查询mysql的事务隔离情况会发现,mysql默认是REPEATABLE-READ可重复读,映射到代码就是在一个事务内,用同样的条件查询数据库查询到的数据是相同的,哪怕别的系统在事务期间插入了数据,你也读不到

1.3. 解决办法

  • mysql使用这样的隔离级别是有道理的,避免重复读取的不准确,只要这个库都归一个系统管理,我们就可以避免我上述的问题
  • 但既然我现在的遗留业务已经成为了这样的逻辑,在不能修改其它系统的前提下,我只能在代码上下功夫,我对读取订单数据的方法c设置了传播级别为REQUIRES_NEW,也就是新起一个事务,那它就不会受到父事务的影响,还要确保进入该方法前插入订单已提交就行
  • 但这样带来的问题是,方法c若执行正确,但包裹了方法c的方法a中其它行报错,则不能回滚方法方法a的执行内容
  • 这样我又需要写额外的补偿代码,当方法a执行错误,且问题不是在方法c时,我要跳过方法c进行方法调用补偿

1.4. 总结

  • 搞的这么复杂,实际上上面的改造在可以动其他系统的情况下,最简单就是获取订单信息不应该系统A来写sql读,既然系统B管理了订单表那么关于它的增删改查都由它提供就不会产生上述问题了
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 事务可重复读采坑
    • 1.1. 问题
      • 1.2. 原因
        • 1.3. 解决办法
          • 1.4. 总结
          相关产品与服务
          云数据库 SQL Server
          腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档