近来遇到一个比较怪异的问题,使用的框架是 spring3和 hibernate3 , 都不知道是 spring问题还是 hibernate3或者其他问题了。
在一个 service 里面 一个方法里面。开启了一个 新事务,用来手动控制提交事务对于这个 一部分的数据
// 将充值状态先保存, 防止下面出现异常回滚掉充值记录
DefaultTransactionDefinition defr = new DefaultTransactionDefinition();
defr.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
// 事物隔离级别,开启新事务,这样会比较安全些。
TransactionStatus statusr = transactionManager.getTransaction(defr); // 获得事务状态
try {
// 记录充值前数据
Recharge recharge = new Recharge();
recharge.setReAccount(0d);
// 以元为单位
recharge.setRechargeAmount(Double.valueOf(tranAmt));
recharge.setStatus(Recharge.STATUS_UNDO);
recharge.setUserbasicsinfo(user);
recharge.setRechargetype("1");// 个人网银
recharge.setRechargeWay(Recharge.RECHARGEWAY_SHORTCUTPAY);
recharge.setTime(DateUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
recharge.setOrderNum(reqNo);// 订单号就是 交易批次号
rechargesService.rechargeSave(recharge);
transactionManager.commit(statusr);
} catch (Exception e) {
transactionManager.rollback(statusr);
LOG.error("通联充值接口调用保存异常", e);
e.printStackTrace();
// 出现了异常,将 异常抛出去,不执行下面的业务了
throw e;
}
// 上面是 手动提交 充值记录
//然后 这里就将上面手动提交的充值记录查询出来。
Recharge rechargeToSuccess = rechargesService.getRecharge2(reqNo);
测试运行的结果是 查询结果为空,而没有报错,同时执行的SQL语句也执行打印出来了。
数据库也有 这个 充值记录数据了。可是就是在 这个 事务里面查询不出来 刚才新事务提交的数据。
这个就比较奇怪了。。。
解决办法
虽然不知道什么原因。可能是 spring 或者hibernate 认为 这个事务没有提交,所以真实是已经提交了, SQL执行了,可是在什么地方给拦截了,没有发给数据库去查询。
解决办法就是, rechargesService.getRecharge2(reqNo); 设置的事务类型是
TransactionDefinition.PROPAGATION_REQUIRES_NEW
开启一个新的事务,就可查询出来了。默认是 TransactionDefinition.PROPAGATION_REQUIRES 是不可以的。