Voyage voyage = Voyage.findByVoyageNo(condition.getVoyageNo(), condition.getShipNameCn());
//没有被处理过的航次才会处理
if(voyage!=null&&voyage.getFlag()!=IsFlag.TRUE){
voyage.setFlag(IsFlag.TRUE);
// 获取入库单详单数据
//没有被处理过的航次才会处理
if(voyage!=null&&voyage.getFlag()!=IsFlag.TRUE){
voyage.setFlag(IsFlag.TRUE);
// 获取入库单详单数据
List<InboundDetail> inboundDetailList = InboundDetail.findByCondition(condition);
此方法前没有任务别的方法操作,但是在InboundDetail里有voyage的关联关系,此查询的hql里包含有关联查询
findByConditionQueryStr.append(" AND inboundDetail.voyage.voyageNo = :voyageNo ");
实际运行时数据库会在 InboundDetail.findByCondition(condition)处卡住,表被锁定
如果将voyage.setFlag(IsFlag.TRUE);语句放置在查询 InboundDetail.findByCondition(condition);后则没有问题,程序能正常运行。
初步估计是因为事务切在该方法上,voyage.setFlag(IsFlag.TRUE);会锁表但是不会提交事务。