Controller1
updateCheckFlagAll方法中,数据库操作顺序为:
- templateSpecService.updateById(templateSpec);
- targetService.updateById(sub);
Controller2
update方法中,数据库操作顺序为:
- targetService.saveOrUpdate(data);
- templateSpecService.updateById(templateSpec);
并发执行时,两个方法都开启事务,都执行完第一步后。
updateCheckFlagAll方法占用templateSpec行锁,update方法占用templateSpecvalueRule行锁。
执行第二步时,updateCheckFlagAll方法等待获取templateSpecvalueRule锁,而update方法等待获取templateSpec锁,两个事务相互等待形成死锁。
解决方法
将两个方法操作数据库的执行顺序改为一致即可。