重构问题-分布式系统中启用事务在update引发的死锁
2017-06-08 15:48
253 查看
环境:系统用spring的事物@Transactional,ibatis对接DB。
目标:方法a原来是本地调用方法b,重构目的为改成远程调用方法b。
问题:方法a中有2次对tableB的更新操作,原方法直接调用两次,一个线程的事务调用事务并无冲突,最终请求到mysql时实际上是在一个事务中。而重构之后方法a首先要更新tableB,但事务没结束不会提交,这时候又去远程调用方法b,方法b也开启事务想更新tableB,但此时方法a持有该事务的锁,方法b只能一直等,直达数据库请求超时,整个请求失败。
解决:同一张表的更新尽量放到同一个事务,如果一定要分开,可以采用分布式事务。我最终是放到了一个事务中。
目标:方法a原来是本地调用方法b,重构目的为改成远程调用方法b。
问题:方法a中有2次对tableB的更新操作,原方法直接调用两次,一个线程的事务调用事务并无冲突,最终请求到mysql时实际上是在一个事务中。而重构之后方法a首先要更新tableB,但事务没结束不会提交,这时候又去远程调用方法b,方法b也开启事务想更新tableB,但此时方法a持有该事务的锁,方法b只能一直等,直达数据库请求超时,整个请求失败。
解决:同一张表的更新尽量放到同一个事务,如果一定要分开,可以采用分布式事务。我最终是放到了一个事务中。
//方法a @Transactional(rollbackFor=Exception.class) public void aServiceImpl (){ updateTableBDAO.updateTableB(); bServiceImpl.updateTableB(); }
//方法b @Transactional(rollbackFor=Exception.class) public void bServiceImpl (){ updateTableBService.updateTableB(); }
相关文章推荐
- 深入解析:分布式系统的事务处理经典问题及模型(转载分享)
- 深入解析:分布式系统的事务处理经典问题及模型
- 深入解析:分布式系统的事务处理经典问题及模型
- 多个事务并发执行update出现的数据库死锁问题排除
- 分布式系统的事务处理经典问题及模型
- 深入解析:分布式系统的事务处理经典问题及模型
- 深入解析:分布式系统的事务处理经典问题及模型(转载分享)
- 由Monkey测试引发的跨多个进程的Android系统死锁问题分析
- 深入解析:分布式系统的事务处理经典问题及模型
- 支付系统转账过程中并发交易引起的分布式死锁问题
- 分布式系统中的事务一致性问题
- 分布式系统的事务处理经典问题及模型
- 深入解析:分布式系统的事务处理经典问题及模型
- 分布式开放消息系统RocketMQ的原理与实践(消息的顺序问题、重复问题、可靠消息/事务消息)
- 在 Windows2003 中启用分布式事务遇到的部分问题
- 深入解析:分布式系统的事务处理经典问题及模型(转载分享)
- 深入解析:分布式系统的事务处理经典问题及模型(转载分享)
- 链接服务器的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务 外加SQL事务死锁问题
- 深入解析:分布式系统的事务处理经典问题及模型
- 消息顺序和消息事务 - RocketMQ及分布式消息系统的原理以及重要问题解读