此问题存在于结算单调整模块中,描述如下:结算单有主表和从表,在一个事务中,调整操作中如果将从表的记录都删掉了,此时业务上的操作应该是删除掉从表记录以后,同时删除主表的记录,由于是在同一个事务中,先删除的是从表,后删除的是主表,在删除主表之前事务比没有提交,此时,如果在删除主表之前通过一个load方法来重新取数据库中明细数据,这时取到的数据应该是在数据中的数据(此时事务还没有提交,所以数据库的数据还是在删除明细的状态的数据),然后根据此次查询到的数据判断是否已经将明细的数据全部删除完,这个判断就会出错,查询到的明细并不是最新的数据,后续操作又根据数据的历史状态来确定,因此问题不可避免。要解决此问题,一个比较简单的方法就是在完成删除明细的操作之后应该马上同步数据到数据库,这样就不会有问题了,当然同步数据到数据库,势必会影响性能,尤其是在数据量比较大的情况之下不可避免。
另外要提到的一点是:在tomcat上运行修改之前的代码是没有上述提到的问题的,在weblogic上运行是存在上述问题的,由此初步推断同一种load数据库数据的方法在tomcat环境中是直接从内存中获取的,而weblogic环境中数据则是从数据库中获取到的(此观点只是根据实际情况推测,没有深究)
具体代码如下:
这是修改之前的代码(虚线的地方是要改动的代码)--
for (ParamsForAdjust paramsForAdjust2 : paramsForAdjust) {
if (paramsForAdjust2.getHandOverNo() != null) {
if (paramsForAdjust2.getSeqPolicy() != null
&& !paramsForAdjust2.getSeqPolicy().equals(null)) {
policy = policyDao.getPolicy(paramsForAdjust2
.getSeqPolicy());
policy.setHandoverno(paramsForAdjust2.getHandOverNo());
policyDao.update(policy, lastdate);
// 新增保单到结算单明细
handoverdetail.setOpstatus("0");
handoverdetail.setOpdate(new Date());
handoverdetail.setOpcode(opcode);
handoverdetail.setPolicyno(policy.getPolicyno());
handoverdetail.setSeqpolicy(policy.getSeqpolicy());
handoverdetail.setSubcompany(policy.getSubcompany());
handoverdetail.setHandoverno(paramsForAdjust2
.getHandOverNo());
handOverDetailDao.addHandOverDetail(handoverdetail);
} else if (paramsForAdjust2.getSeqHandOverdetail() != null) {
// 更新保单
handoverdetail = handOverDetailDao
.getHandOverDetail(paramsForAdjust2
.getSeqHandOverdetail());
policy = policyDao.getPolicy(handoverdetail
.getSeqpolicy());
policy.setHandoverno(null);
policyDao.update(policy, lastdate);
// 结算单调整对结算单明细的操作--删除结算单明细
// 取消明细
handOverDetailDao.cancelHandOverDetail(paramsForAdjust2
.getSeqHandOverdetail());
} else {
throw new BusinessException("操作失败:结果集数据不正确!");
}
} else
throw new BusinessException("操作失败:取消操作获取的信息不全--未获取到结算单号!");
}
//---------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
List list = handOverDetailDao
.getHandOverDetailbyHandOverno(paramsForAdjust.get(0)
.getHandOverNo());
if (list != null && list.size() == 0) {
HandOver handover = handOverDao.getHandOver(
paramsForAdjust.get(0).getHandOverNo()).get(0);
handOverDao.deleteHandOver(handover.getSeqhandover());
// if (handover == null) {
// throw new BusinessException("操作失败:获取结算单<?>数据出错!");
// }
// handover.setOpstatus("3");
}
这是修改后的代码(虚线的地方是改动后的代码,其他没有变化):
for (ParamsForAdjust paramsForAdjust2 : paramsForAdjust) {
if (paramsForAdjust2.getHandOverNo() != null) {
if (paramsForAdjust2.getSeqPolicy() != null
&& !paramsForAdjust2.getSeqPolicy().equals(null)) {
policy = policyDao.getPolicy(paramsForAdjust2
.getSeqPolicy());
policy.setHandoverno(paramsForAdjust2.getHandOverNo());
policyDao.update(policy, lastdate);
// 新增保单到结算单明细
handoverdetail.setOpstatus("0");
handoverdetail.setOpdate(new Date());
handoverdetail.setOpcode(opcode);
handoverdetail.setPolicyno(policy.getPolicyno());
handoverdetail.setSeqpolicy(policy.getSeqpolicy());
handoverdetail.setSubcompany(policy.getSubcompany());
handoverdetail.setHandoverno(paramsForAdjust2
.getHandOverNo());
handOverDetailDao.addHandOverDetail(handoverdetail);
} else if (paramsForAdjust2.getSeqHandOverdetail() != null) {
// 更新保单
handoverdetail = handOverDetailDao
.getHandOverDetail(paramsForAdjust2
.getSeqHandOverdetail());
policy = policyDao.getPolicy(handoverdetail
.getSeqpolicy());
policy.setHandoverno(null);
policyDao.update(policy, lastdate);
// 结算单调整对结算单明细的操作--删除结算单明细
// 取消明细
handOverDetailDao.cancelHandOverDetail(paramsForAdjust2
.getSeqHandOverdetail());
} else {
throw new BusinessException("操作失败:结果集数据不正确!");
}
} else
throw new BusinessException("操作失败:取消操作获取的信息不全--未获取到结算单号!");
}
//-------------------------------------------------------------------------------------------------
//同步结算单明细操作到数据库中,如果不同步,以下的查询不会取到此次操作的最新数据
handOverDetailDao.flushDataForHandOverDetail();
//-------------------------------------------------------------------------------------------------
List list = handOverDetailDao
.getHandOverDetailbyHandOverno(paramsForAdjust.get(0)
.getHandOverNo());
if (list != null && list.size() == 0) {
HandOver handover = handOverDao.getHandOver(
paramsForAdjust.get(0).getHandOverNo()).get(0);
handOverDao.deleteHandOver(handover.getSeqhandover());
// if (handover == null) {
// throw new BusinessException("操作失败:获取结算单<?>数据出错!");
// }
// handover.setOpstatus("3");
}