文档章节

spring 事务 对象保存之后,修改的时候,自动更新提交?

之渊
 之渊
发布于 2018/02/26 16:14
字数 604
阅读 151
收藏 0

这段时间遇到一个 很奇怪的问题。而这个问题,其实一直都困扰着我,只是以前没有怎么去分析,以为是其他问题引起的。可是 这块代码重构时候老是出现问题,而且又不敢随便动,只好慢慢 分析研究了。

问题

情况是这样的, 在spring 事务方法里面, 保存一个 充值对象, 然后将 刚才的新的充值对象 查询出来,修改 里面的某些属性值。 这时候 并没有 执行更新语句,而且执行其他的对象操作更新保存了。 最后呢 ,发现 这个 对象为什么会 字段更新?又没有执行更新方法? 开始一直以为 是其他对象表关联了这个对象表,自动更新了。因为使用的 是 hibernate 。 可是后来分享的时候,发现一点关系没有。。。

代码

代码大概:


	

		// 充值 成功或者失败
		if (Objects.equals(result.getCode(), AllinpayConstant.SUCCESS_CODE)) {
// 记录充值前数据
		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);
....
        // 充值成功后的业务
		this.allinPayRechargeAfterDo(result, reqNo, userBank, tranAmtDecimal);
                。。。。。


@Transactional(propagation = Propagation.REQUIRES_NEW) // 开启一个新的事务,如果之前有了一个事务,那么挂起
	public void allinPayRechargeAfterDo(AllinpayResult result, String reqNo, UserBank userBank,
			BigDecimal tranAmtDecimal) {
// 充值成功
			Recharge rechargeToSuccess = rechargesService.getRecharge(reqNo);// 查询出来
			
			 rechargeToSuccess.setStatus(Recharge.STATUS_SUCCESSE);// 充值成功
			 rechargeToSuccess.setReAccount(tranAmtDecimal.doubleValue());// 实际充值,以元为单位
			// 记录充值成功后相关流水
			 rechargesService.rechargeReturn(rechargeToSuccess);
。。。。 

大概就是这样的情况

分析

其实是这样的, 因为这个方法的 前面的 插入数据的时候, 事务没有提交,而查询的时候 框架可以把自己事务里面未提交的数据给查询出来。 这时候 进行 修改属性值得时候。 事务提交了,就把 这个 充值对象 最新的 给拿出来 存入数据库里面了。 所以不需要 手动去更新了的。就是这样子的简单原因。 可以看到哪怕 更新的时候的 方法 标志使用了 一个新事务 @Transactional(propagation = Propagation.REQUIRES_NEW) 都是不可以避免的。对于 最外层的事务来说 ,都是一样可以控制的。

© 著作权归作者所有

共有 人打赏支持
之渊
粉丝 11
博文 551
码字总数 161987
作品 0
佛山
程序员
私信 提问
HIbernate数据动态更新

当spring整合hibernate之后事务就会被spring进行托管,那么当你在一个get一个对象之后在进行set对象时候你发现,事务提交后会执行一段update语句,数据库中的值也会改变,这就是动态更新。就...

刘梓航
2014/11/04
0
0
spring事务和jdbc事务

Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取...

TonyStarkSir
2018/04/16
0
0
REST微服务的分布式事务实现-分布式系统、事务以及JTA介绍

事务,是操作数据库中的数据的逻辑单元。在处理一个业务过程中,事务保证多个数据修改的操作,要么都修改成功,要么都失败。同时,几个事务之间又相互独立,不会相互影响。 在这篇文章中,我...

tyou
2017/11/07
0
0
spring jpa hibernate : update entity ,自动提交 ?

在 新建一个 entity 的时候,需要显示的 save 进行提交,才可以存入数据库 Entity e = new Entity(); e.setName("tom"); .... Repository.save(e); //org.springframework.data.jpa.reposit......

javadever
2014/08/20
3K
2
Spring声明事务的时候如果代码中有commit会发生什么

在利用Spring声明的事务和Spring提供的对持久层的Template操作数据库的时候,原则上不要在代码里写事务控制的语句(commit). 1,用JdbcTemplate和JDBC集成的时候: commit语句对testInsert方法没...

晨曦之光
2012/04/25
2.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS 选择器参考手册

CSS 选择器参考手册 选择器 描述 [attribute] 用于选取带有指定属性的元素。 [attribute=value] 用于选取带有指定属性和值的元素。 [attribute~=value] 用于选取属性值中包含指定词汇的元素。...

Jack088
今天
1
0
数据库篇一

数据库篇 第1章 数据库介绍 1.1 数据库概述  什么是数据库(DB:DataBase) 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据...

stars永恒
今天
2
0
Intellij IDEA中设置了jsp页面,但是在访问页面时却提示404

在Intellij IDEA中设置了spring boot的jsp页面,但是在访问时,却出现404,Not Found,经过查找资料后解决,步骤如下: 在Run/Debug Configurations面板中设置该程序的Working Directory选项...

uknow8692
昨天
3
0
day24:文档第五行增内容|每月1号压缩/etc/目录|过滤文本重复次数多的10个单词|人员分组|

1、在文本文档1.txt里第五行下面增加如下内容;两个方法; # This is a test file.# Test insert line into this file. 分析:给文档后增加内容,可以用sed 来搞定;也可以用while do done...

芬野de博客
昨天
4
0
深入理解JVM—JVM内存模型

深入理解JVM—JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存...

onedotdot
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部