您的位置:首页 > 数据库 > MySQL

重构问题-分布式系统中启用事务在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
@Transactional(rollbackFor=Exception.class)
public void aServiceImpl (){
updateTableBDAO.updateTableB();
bServiceImpl.updateTableB();
}


//方法b
@Transactional(rollbackFor=Exception.class)
public void bServiceImpl (){
updateTableBService.updateTableB();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 分布式 事务