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 是不可以的。

猜你喜欢

转载自my.oschina.net/u/2419285/blog/1623712