Spring事务失效
类内部访问导致事务不生效原因:
注解@Transaction的底层实现是Spring AOP技术,而Spring AOP技术使用的是动态代理。spring事务失效的原因就是动态代理失效的原因:
- 对于static方法和非public方法,注解@Transactional是失效的,因为不会代理并拦截这些方法。
- 子调用(直接this调用带有事务方法),也因为直接调用自身对象的方法,直接在目标对象内部执行,不经过代理,因此事务也失效。
- 还有目标对象实例化吗?
主要讲解 4 种事务不生效的 Case:
- 类内部访问:A 类的outer方法没有标注 @Transactional,inner方法标注 @Transactional,在 outer 里面直接调用inner(如用this.关键字);
- 私有方法:将 @Transactional 注解标注在非 public 方法上;
- 异常不匹配:@Transactional 未设置 rollbackFor 属性,而方法返回 Exception 等异常;或是事务方法内部产生的异常被catch后没有向外部抛出;
- 多线程:主线程和子线程的调用,线程抛出异常
即使Spring已经管理了某个事务方法(即为这个方法创建了代理),当这个方法内部调用私有方法时,这个私有方法的调用仍然会绕过代理对象,
原来不止创建了代理对象,还有目标对象的吗?还是说先创建目标对象,再创建代理?当在包装的代理中使用invoke的时候,是不是已经是目标对象亲自操作了?
似乎这里要先看spring启动、创建bean的原理
我目前的想法与可能的误区:
Bean都是代理对象?注入的都是代理? 是的,注入的都是实现了同一接口的Spring代理,因此他们也拥有接口中定义的方法,用起来就像真正的对象一样。
如果是的话,那还要真正的目标对象干什么?什么时候创建的真正对象?从创建代理的 private Object target;来看,目标对象还是被创建了。当我们this子调用的时候,虽然外部outer方法是调用的代理类的,但是代理方法内部还是调用了目标对象的原方法,而在其中的this调用是不经过代理对象的。
但我记得反射是可以打破私有的限制的,为什么无法代理私有方法?
答:接口忘了有没有私有方法,反正不会被目标对象实现。jdk动态代理是通过接口生成代理对象,自然不会有目标对象的私有方法。
被代理方法调用私有方法,私有方法了里的mapper进行数据库操作,会和父方法在一个连接里吗?是的话又在一个事务管理器里吗?调用mapper方法的时候是怎么选择连接?
解决方法:
事务自调用: @Resource 获取自己的代理对象
编程式事务管理:TransactionTemplate
异常控制
(请回忆动态代理:用代理类包裹了原方法。因此,目标类方法中产生的异常可以传递到代理类)
对于一个被标记了@Transactional的方法,
如果内部发生异常,但是自己有catch语句,可以考虑在catch块中做相应处理,这样异常不会被扔出方法,也就不会被外部的代理对象捕获,也就不会回滚;
如果catch后仍然想回滚,就再手动throw异常,或者使用编程式事务管理,编写代码TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
来让当前事务回滚。
多线程事务
Spring事务管理的传播机制是使用 ThreadLocal 实现的。因为 ThreadLocal 是线程私有的,所以 Spring 的事务传播机制是不能够跨线程的。
根据结果统一回滚。不过太复杂了不如手动处理。这个业务也挺少见,我都后悔记这一章节笔记了。
相关文章:
Spring事务失效
类内部访问导致事务不生效原因: 注解Transaction的底层实现是Spring AOP技术,而Spring AOP技术使用的是动态代理。spring事务失效的原因就是动态代理失效的原因: 对于static方法和非public方法,注解Transactional是失效的,因为不…...

Qt QLabel标签制作弹框效果,3s后缓慢自动消失
效果图 初始化说明 void InitStatusTips() {if (NULL statusTips_) {return;}statusTips_->setFixedSize(300, 80);//固定大小statusTips_->move((width() - statusTips_->width()) / 2, height() - 30 - statusTips_->height());//移动位置statusTips_->setA…...
JZ55 二叉树的深度
二叉树的深度_牛客题霸_牛客网 递归代码太简单-一行就可以,可以用二叉树的层序遍历,顺便温习下二叉树层序遍历的写法。 对应leetcode 104题,层序遍历对应leetcode-102自顶向下,leetcode-107自底向上 /* struct TreeNode {int val;struct Tre…...

视频号分销系统搭建教程,源代码+部署上线指南
目录 一、视频号分销是什么? 二、视频号分销系统怎么搭建? 1.系统架构设计 2.部署与上线 3.持续迭代与升级 三、部分代码展示 一、视频号分销是什么? 视频号分销系统是合集了视频号商家的产品,推广达人推广商家的产品可赚取…...
【python】cryptography库学习
【python】cryptography库学习 cryptography学习1-安装2-cryptography学习2.1-fernet的使用2.2-padding填充2.3-Hash2.4-ciphers(对称算法AES为例)2.5-asymmetric(非对称算法RSA为例)函数:generate_private_key类:RSAPrivateKey&a…...

解密!抖音百万粉丝博主三维地图视频都用到了什么GIS数据和技术
引言 在抖音上有许多诸如三维地图科普局、三维地图看世界和三维地图鉴赏等百万粉丝博主靠着三维地图科普城市、景区、人文和地理视频获赞百万,在我们浏览视频时犹如身临其境一般,那么制作这些视频需要什么GIS技术呢?如何利用MapMost技术自己…...
Python知识点:如何使用Kubernetes与Python进行容器编排
Kubernetes 是一个开源的容器编排平台,用于自动化容器化应用的部署、管理和扩展。结合 Python,你可以通过 Kubernetes API 和工具,如 kubectl 和 kubernetes-client 库,来编写和管理容器化应用。以下是如何使用 Kubernetes 和 Pyt…...
Markdown与Word中插入图片的方法及比较
在撰写文档时,无论是技术文档、博客还是学术论文,插入图片都是非常常见的需求。本文将对比两种流行的文本编辑工具——Markdown和Microsoft Word——在插入图片方面的异同点。 Markdown插入图片 如何插入图片 在Markdown中插入图片非常简单࿰…...

Vue3+Vite安装配置tailwindCss
考虑到官网不是很好访问,这里记录一下简单步骤方便小友查阅 1. 安装依赖 npm install -D tailwindcss postcss autoprefixer2. 初始化配置文件 npx tailwindcss init -p3.配置模板路径 /** type {import(tailwindcss).Config} */ export default {content: [&quo…...

大数据学习-Spark基础入门
一、Spark是什么? Stack Overflow的数据可以看出,2015年开始Spark每月的问题提交数量已经超越Hadoop,而2018年Spark Python版本的API PySpark每月的问题提交数量也已超过Hadoop。2019年排名Spark第一,PySpark第二;而十…...
C语言:链表插入
链表的插入分为头插入,中间插入和尾插入。 具体方法如下: #include<stdio.h> #include<stdlib.h>typedef struct node {int s;struct node* pnext; }list;list* addnode(list** pphead, list** ppend, int n) {list* ptemp malloc(sizeof…...

xss 一些例子
目录 XSS 1.Ma Spaghet!编辑 2.Jefff编辑 3.Ugandan Knuckles编辑 4.Ricardo Milos编辑 5.Ah Thats Hawt编辑 6.Ligma编辑 7.Mafia编辑 简单解法就是换一个函数 作者得原意解法 8.Ok, Boomer编辑 XSS 1.Ma Spaghet! 这里接收了一个somebody参数&…...

基于Docker compose部署Confluence 8.3.4及设置数据持久化存储的总结
基于Docker compose部署Confluence 8.3.4及设置数据持久化存储的总结 一、环境信息二、安装部署三、向导 介绍如何基于Docker、Docker Compose的方式安装部署Confluence 8.3.4,并且设置数据的持久化存储。 一、环境信息 操作系统:CentOS 7.9 Docker Ver…...

eNSP 华为交换机生成树协议
华为交换机生成树协议 生成树协议原理与作用 选举一个交换机作为根网桥(生成树的根),计算出到其他所有交换机的最佳路径,把备用路径的端口设为堵塞状态(逻辑上关闭备用路径),当最佳路径故障再…...
flutter事件与消息通知
事件与消息通知 一、原始指针事件(触摸事件) 命中测试 事件阶段:手指按下、手指移动、手指抬起事件冒泡,无法停止冒泡Listener 组件:监听原始触摸事件 onPointerDown:手指按下回调onPointerMove:手指移动回调onPointerUp:手指抬起回调onPointerCancel:触摸事件取消回…...
Oracle PL/SQL存储过程和函数简单示例
以下是关于Oracle PL/SQL存储过程和函数的一些问题和答案: 问题1:什么是Oracle PL/SQL? 答案:Oracle PL/SQL(Procedural Language Extensions to SQL)是Oracle对SQL的过程语言扩展,它是一种编…...

同态加密和SEAL库的介绍(十)CKKS 参数心得 2
写在前面: 本篇继续上篇的测试,首先针对密文深度乘法情况,虽然密文乘法本就是应该尽量避免的(时间和内存成本过高),更不用说深度乘法了,但是为了测试的完整性,还是做一下方便大家比对…...

Debug-021-el-table实现分页多选的效果(切换分页,仍可以保持前一页的选中效果)
前情提要: 这个功能实现很久了,但是一直没有留意如何实现,今天想分享一下。具体就是我们展示table数据的时候,表格中的数据多数情况是分页展示,毕竟数据量太多,分页的确是有必要的。那么我们有业务需要给表…...

FPGA开发——DS18B20读取温度并且在数码管上显示
一、简介 在上一篇文章中我们对于DS18B20的相关理论进行了详细的解释,同时也对怎样使用DS18B20进行了一个简单的叙述。在这篇文章我们通过工程来实现DS18B20的温度读取并且实现在数码管伤显示。 1、基本实现思路 根据不同时刻的操作,我们可以使用一个状…...

电流测量分流电阻
电流测量分流电阻 测量电流的设备称为安培计。大多数现代安培计测量已知电阻的精密电阻上的电压降。电流的计算使用欧姆定律:我五R 大多数电流表都内置电阻器来测量电流。但是,当电流对于电流表来说太高时,需要不同的设置。解决方案是将电流…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...