java先提交后查询_spring 新的事务手动commit 提交后,再次查询查询不到新事务提交的值??...

近来遇到一个比较怪异的问题,使用的框架是 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 是不可以的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值