重构问题-分布式系统中启用事务在update引发的死锁

xiaoxiao2021-02-28  65

环境:系统用spring的事物@Transactional,ibatis对接DB。 目标:方法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(); }
转载请注明原文地址: https://www.6miu.com/read-84318.html

最新回复(0)