文档章节

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

之渊
 之渊
发布于 02/26 16:14
字数 604
阅读 132
收藏 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
博文 520
码字总数 154962
作品 0
佛山
程序员
HIbernate数据动态更新

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

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

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

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

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

tyou
2017/11/07
0
0
Spring Transaction + MyBatis SqlSession事务管理机制研究学习

原文地址:Spring Transaction + MyBatis SqlSession事务管理机制研究学习 线上的系统中,使用的是Spring+Mybatis+Mysql搭建的框架,由于客户需要,最近一直在对性能提升部分进行考虑,主要是...

Realfighter
2015/01/10
0
1
@Transaction必知必会

1. Spring事务的基本原理 事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式...

maskwang520
04/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sed命令扩展使用操作

打印某行到某行之间的内容 假若文件test.txt的内容是: ertfff**[abcfd]123324444[rty]**fgfgf 怎么能截取 [abcfd]123324444[rty] 这一部分出来呢? 操作命令: 知道开始行和结...

野雪球
30分钟前
1
0
JVM内存笔记

Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓 冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原...

凌渡
36分钟前
1
0
284. Peeking Iterator

Description Tag: Design Difficulties: Medium Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the pee......

52iSilence7
38分钟前
1
0
防止快速重复点击的两种思维

防止重复执行的两种思维 场景 下单时,提交按钮,因为网络卡顿或者手快重复点击,导致重复提交订单; 微博,更新个人状态或发表评论时,快速多次点击[发送]按钮,导致相同的信息发送多次. 解决思路 ...

黄威
今天
0
0
在windows环境下使用Virtualbox虚拟Debian系统来运行Docker

标题绕口。 我之前一直使用 Virtualbox 和 homestead 来运行我的 PHP 开发环境。最近决心开始尝试 DevOps,使得开发、部署容器化,来化解人为操作失误和环境不兼容等问题造成的各种损失。就打...

zgldh
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部