环境:系统用spring的事物@Transactional,ibatis对接DB。 目标:方法a原来是本地调用方法b,重构目的为改成远程调用方法b。 问题:方法a中有2次对tableB的更新操作,原方法直接调用两次,一个线程的事务调用事务并无冲突,最终请求到mysql时实际上是在一个事务中。而重构之后方法a首先要更新tableB,但事务没结束不会提交,这时候又去远程调用方法b,方法b也开启事务想更新tableB,但此时方法a持有该事务的锁,方法b只能一直等,直达数据库请求超时,整个请求失败。 解决:同一张表的更新尽量放到同一个事务,如果一定要分开,可以采用分布式事务。我最终是放到了一个事务中。
@Transactional(rollbackFor=Exception.class)
public void aServiceImpl (){
updateTableBDAO.updateTableB();
bServiceImpl.updateTableB();
}
@Transactional(rollbackFor=Exception.class)
public void bServiceImpl (){
updateTableBService.updateTableB();
}