事务可重复读采坑
2019-09-23 09:04:38来源:博客园 阅读 ()
事务可重复读采坑
1. 事务可重复读采坑
1.1. 问题
- 今天碰到个事务幻读的情况,不容易啊,这不是事务间造成的问题,而是rpc调用产生的问题,实际上业务比较规范也不会出现这样的问题。
- 具体情况是系统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管理了订单表那么关于它的增删改查都由它提供就不会产生上述问题了
原文链接:https://www.cnblogs.com/sky-chen/p/11557648.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 聊聊微服务架构及分布式事务解决方案! 2020-06-10
- Spring12_Spring中的事务控制 2020-06-07
- Spring事务的传播属性 2020-06-05
- Spring08_纯注解实战_支持事务版本 2020-05-29
- 突击Java分布式面试-事务解决方案解析 2020-05-19
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash