hibernateTransactionManager 与REQUIRES_NEW的问题

Spring事务与AOP原理深度解析:从注解到动态代理的实现机制 在Java企业级开发中,面向切面编程(AOP)是一种重要的设计范式,其核心思想是将横切关注点(如事务管理、日志记录)从核心业务逻辑中分离,实现代码的解耦与复用。AOP通过动态代理技术,在不修改源代码的情况下,为方法调用添加额外行为,这一机制正是Spring框架实现声明式事务管理的基石。Spring事务的本质是利用AOP拦截目标方法,在方法执行前后自动处理事务的开启、提交与回滚,从而将开发者从繁琐的模板代码中解放出来。这种设计不仅提升了代码的整洁度,还确保了事务的一致性与可靠性。在实际应用中,Spring事务 阅读详情
业务场景:
   外层一个大的事务,嵌套一个内层事务(如单据号获取后即递增更新到数据库),内层事务需独立提交(其原子性为了避免并发问题),不受外层事务影响(回滚或提交)。
  现使用hibernateTransactionManager管理事务;
  外层事务propagation="REQUIRED"
  内层事务propagation="REQUIRES_NEW"
执行时内层事务可以顺利提交,但是外层事务老是抛乐观锁异常(项目中采用乐观锁机制),即内层的事务涉及的更新语句在外层事务提交时又去执行一次了。。。
  网上查半天都没有看到类似的问题解决方案,有人遇到同样问题吗?该如何解决?  

A1:
按你的描述,你的事务配置是正确的:
外层事务propagation="REQUIRED"
内层事务propagation="REQUIRES_NEW"

你可以检查你配置的事务是否真由Spring托管,不是在代码中提交。  


A2:

非常感谢您的回复!
我们的事务都是使用Spring AOP的方式切入,不存在代码提交的情况。
如果内层事务也配置成propagation="REQUIRED",是正常的,只有在并发的情况下才偶尔会有乐观锁异常抛出,
内层事务尝试了AOP的方式切入,注解方式,HibernateTemplate().getSessionFactory().openSession()等方式,都同样只要一调用就有乐观锁异常。
另:我们用的是spring3.0, hibernate3.0。会不会hibernateTransactionManager就是不支持这样的事务嵌套。


final Answer:

问题解决!
问题出在,内层事务更新之前有先把对象查询出来,而这个查询的方法没有被只读事务切到,
导致查询出来的对象改变后,外层事务提交时会重新执行更新.

解决办法:业务逻辑层

1、查询方法添加只读事务@Transactional(propagation=Propagation.REQUIRES_NEW,readOnly=true)
2、更新方法添加@Transactional(propagation=Propagation.REQUIRES_NEW) 

用例层的aop切入配置不变。 


Spring 事务源码分析——Hibernate篇 在Spring与Hibernate整合的时候,可以利用Spring的事务管理机制,为我们管理事务的开启、提交、回滚等操作。这样的方式极大的减少了我们的代码量,让我们只专注于业务代码的编写。在使用Hibernate的时候,每一个操作都要经历事务开启与提交这样的操作,他们在业务代码的周围,这样来看是不是就想到了AOP编程,把这部分代码抽取出来。没错,Spring正是这样做的,Spring的事务管理就是 阅读详情

相关推荐

Ubuntu 22.04下Nvidia显卡驱动安装全攻略:从PPA源到避坑指南

本文详细介绍了在Ubuntu 22.04系统下安装Nvidia显卡驱动的完整流程,包括PPA源的使用、旧驱动清理、安装后验证及常见问题解决方案。特别针对机器学习开发者和图形设计师,提供了从基础安装到性能调优的全方位指南,帮助用户避免常见安装陷阱并优化GPU性能。

weixin_29213655的博客 381

Spirng中事务的传播性

Spring的事务传播

qq_62698326的博客 1996

【数学模型】灰色关联分析

数学模型-灰色关联分析

suic009的博客 1万+

【高并发基础】Spring 事务传播级别及造成死锁的隐患分析

本项目聚焦高并发的基础知识,至底向上得研究:github 仓库 (分支 master / isolation / propagation / multithreading) 理念:事务传播行为官网描述 用于区分声明式事务catch到异常由框架回滚,本文的“回滚”用到编程式事务的API 支持主动回滚。编程式事务官网描述 讨论的模型是 调用方(外层) -> 被调用方(内层)默认传播行为, 确保当前方法一定处于事务保护中用于减少事务的粒度,如果不是关键的业务逻辑或是运行出错的逻辑,可以用 声明与调用方事务隔离。

chenghan_yang的博客 2439

基于STM32的智能停车场管理系统

随着城市车辆数量激增,传统停车场管理效率低下。本文设计了一款基于STM32的智能停车场管理系统,支持车牌识别、车位引导、自动计费等功能,可显著提升停车场运营效率。系统适用于商场、小区等场景,支持多终端协同管理。本系统实现了停车场智能化管理,显著提升了运营效率。:STM32F746(高性能Cortex-M7)问题讨论,stm32的资料领取可以私信!:OV7725摄像头(30fps):ESP32(Wi-Fi+蓝牙)红外对射传感器(车辆进出检测)支持蓝牌、黄牌、新能源车牌。⬇帮大家整理了单片机的资料。

stm32d1219的博客 878

【python科研数据处理】将Endnote自动搜索的所有pdf文件,全都移动指定文件夹中

将Endnote自动搜索到的全部pdf文件,全都移动指定文件夹中1 背景2 问题解决 手动反爬虫,禁止转载:原博地址 https://blog.youkuaiyun.com/lys_828/article/details/122370892(优快云博主:Be_melting) 知识梳理不易,请尊重劳动成果,文章仅发布在优快云网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息 1 背景 在进行期末考试周后,面对最后一门功课,需要提交至少80篇SCI参考文献,因此最快下载文献的方式就是通过Web of S

lys_828的博客 1826

Spring学习04:事务控制(TransactionManager)

Spring学习04:事务控制[TransactionManager]Spring事务控制Spring中事务控制的API使用Spring进行事务控制Spring配置式事务控制项目准备使用xml配置事务控制使用半注解配置事务控制使用纯注解式事务配置Spring编程式事务控制 Spring事务控制 JavaEE 体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方 ...

ncepu_Chen的博客 1万+

ScanNetV2 数据集讲解和选择性下载

写在前面的话: 不可转载!!!!!!!!!!!! ScanNetV2一共1.2T,数据太大本文会简单讲解如何下载自己想要的文件,并附上修改后的下载程序 ScanNetV2:http://www.scan-net.org/ 简介 ScanNetV2的作者是斯坦福大学的博士,其团队通过收集RGB-D的视频序列,通过ipad应用加深传感器而收集的,然后视频会被上传到服务器,并被自动重建。然后,视频会被给到亚马逊 Mechanical Turk,将标注工作众包出去。ScanNetV2是RGB-D数据集,.

qq_35781447的博客 2万+

transactionManager手动事物管理--记一次重大的生产事故

前言 最近在线上环境出现了一个机器总是宕机的问题。就是资源总是耗尽,但是报错的功能点还不一样,每次报错之后都是先重启解决。但是支撑不了一天又会出现资源耗尽的提示。不过,哪个功能出现问题之后,经过仔细的代码检查的之后,还是能发现之前的代码不够严谨,虽然修改了代码,重新上环境之后,发现问题没有根本解决。最后通过查阅了大量的日志文件之后,发现是有一个同事由于使用的ibatis根据表名动态保存数据的方式,采用的是自己手动管理事务的方式,但是在有一个出现异常的地方没有回滚也没有提交,然后这个功能是每天定时根据项目触发

daimeijin的博客 1914

【DevOps】rancher集成ldap,实现统一账号登录

登录到rancher控制台,选择【安全】-【认证】 选择【OpenLDAP】 其中【搜索起点】需要去ldap界面查配置完成

CN_Eden 1092

笔试题-2023-星宸-数字IC设计【纯净题目版】

4 笔试题-2023-星宸-数字IC设计【纯净题目版】

w0shishabi的博客 1171

Spring事务管理详解

1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱。 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱;然后ATM出1000元钱。这两个步骤必须是要么都执行要么都不执行。如果银行卡扣除了1000块但是ATM出钱失败的话,你将会损失1000元;如果银行卡扣钱失败但是ATM却出了1000块,那么银行将损失1000元。所以,如果一个步骤成功另一个步骤失败对双方都不是好事,如果不管哪一个步骤失败了以后,整个取钱过程都能回滚,也就是完全取消所有操作的话,这对双方都

weixin_57763462的博客 332

ADB加密实例

主要介绍如何给adb命令增加加密访问

四儿家的小祖宗的博客 2909

Spring事务机制:原理、实践与性能优化

事务是数据库操作中确保数据一致性的关键技术,其核心原理是通过ACID特性(原子性、一致性、隔离性、持久性)保证多个操作的完整性。在Java生态中,Spring事务机制通过AOP技术对JDBC事务进行标准化封装,极大简化了开发复杂度。Spring事务的核心组件包括事务管理器(PlatformTransactionManager)、事务定义(TransactionDefinition)和事务拦截器(TransactionInterceptor),支持声明式配置和多种传播行为。在实际工程中,合理使用REQUIRE

weixin_33795743的博客 351

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

spring hibernate 事务管理 属性

  spring hibernate 事务管理 属性 说明 spring提供了以下的事务类型: 1.  PROPAGATION_REQUIRED:支持当前正在运行的事务,如果事务不存在则创建新的事务 2.  PROPAGATION_REQUIRES_NEW:永远创建新的事务,如果当前存在事务则先挂起该事务的执行。 3.  PROPAGATION_SUPPORTS:如果在事务上...

Ken's world 246

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring 声明式事务处理的设计与实现:从 AOP 封装到事务创建、提交与回滚的源码解析

本文基于 doocs/source-code-hunter 仓库中 [Spring事务处理的设计与实现](https://link.gitcode.com/i/b6a1ea498bf4ff03a4282beaabf789d3) 一文,深入剖析 Spring 事务处理模块的源码实现:从编程式事务的基本模型出发,沿着 `TransactionInterceptor` 拦截器 → `Transactio

gitblog_00893的博客 813

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

TransactionTemplate编程式事务实战:从原理到踩坑,彻底掌握Spring事务控制

在Spring框架中,事务管理是保障数据一致性的核心能力。开发人员通常习惯使用@Transactional注解来声明式地管理事务,但在批处理、多数据源、动态回滚等复杂场景下,声明式事务存在代理失效、事务边界过大、异常映射不灵活等隐患。TransactionTemplate作为Spring提供的编程式事务模板,基于模板方法模式封装了事务获取、提交、回滚的完整流程,让开发者能够精确控制事务边界与回滚时机。通过理解其与PlatformTransactionManager的协作机制,掌握REQUIRES_NEW传播

cuiji1279的博客 138

Spring整合Hibernate:2、使用Annotation方式进行声明式的事务管理

1、加入DataSourceTransactionManager的命名空间 修改applicationContext.xml文件,增加如下内容: 1 2 ...

chuankangyu5735的博客 87

史上最详细的Spring事务讲解,Spring框架从入门到精通学习教程

Spring 的事务管理 事务原本是数据库中的概念,在 Dao 层。但一般情况下,需要将事务提升到业务层,即 Service 层。这样做是为了能够使用事务的特性来管理具体的业务。 在 Spring 中通常可以通过以下两种方式来实现对事务的管理: (1)使用 Spring 的事务注解管理事务 (2)使用 AspectJ 的 AOP 配置管理事务 Spring 事务管理 API Spring 的事务管理,主要用到两个事务相关的接口。 (1)事务管理器接口(重点) 事务管理器是 .

Java___interview的博客 434

hibernate手动提交事务

自动注入事务管理器 @Resource private HibernateTransactionManager transactionManager; TransactionDefinition td = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW); TransactionStatus ts =transactionManager.getTransaction(td); //

qq_35745341的博客 2536

Spring Boot非JPA整合Hibernate:SessionFactory原生配置实战

在Java持久层开发中,ORM框架是连接对象模型与关系数据库的桥梁,而Hibernate是其中应用最广的实现之一。虽然Hibernate实现了JPA规范,但二者并非强制绑定。当项目需要更底层的控制能力,比如使用SessionFactory直接管理Session、利用@Where、@Formula等Hibernate专属注解时,绕过Spring Data JPA和EntityManager,直接基于LocalSessionFactoryBean构建原生Hibernate环境就成为更有价值的选择。这种配置方式特

weixin_34038293的博客 308

Spring保姆级教程,深入理解Spring事务原理

Spring 的事务管理 事务原本是数据库中的概念,在 Dao 层。但一般情况下,需要将事务提升到业务层,即 Service 层。这样做是为了能够使用事务的特性来管理具体的业务。 在 Spring 中通常可以通过以下两种方式来实现对事务的管理: (1)使用 Spring 的事务注解管理事务 (2)使用 AspectJ 的 AOP 配置管理事务 Spring 事务管理 API Spring 的事务管理,主要用到两个事务相关的接口。 (1)事务管理器接口(重点) 事务管理器是 PlatformT

assdfgdfgjhtdo的博客 221

spring+hibernate使用手动事务-session与当前线程绑定

spring+hibernate使用手动事务-session与当前线程绑定前言HibernateTransactionManagerTransactionSynchronizationManager 前言 在做一个定时执行job的时候(非web项目),发现配置的事务没有起作用,大佬指点说是因为session没有与当前线程绑定。似懂非懂,查了好多资料,自己又一点一点测试,发现以下两种方法。仅供参考,...

siyu_siyu的博客 1339

SpringAOP配置事务

JavaEE高级工程师的专栏 1862

声明式事务控制_编程式事务控制相关对象

REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。NESTED如果当前存在事务,则在嵌套事务内执行。NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)REQUERS_NEW新建事务,如果当前在事务中,把当前事务挂起。MANDATORY使用当前的事务,如果当前没有事务,就抛出异常。NEVER以非事务方式运行,如果当前存在事务,抛出异常。.........

LY3054404567的博客 141

Spring笔记(4) - Spring的编程式事务和声明式事务详解

一.背景 事务管理对于企业应用而言至关重要。它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性。就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到操作过程中机器突然出故障的情况,此时,事务就必须确保出故障前对账户的操作不生效,就像用户刚才完全没有使用过取款机一样,以保证用户和银行的利益都不受损失。 事务特性 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性(Con

欢迎点赞 + 关注,开源项目见下方栏目 1万+
上一篇: Java中 char和int之间的转换
下一篇: Spring的事务和Hibernate的事务有什么区别
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值