Spring事务实现的方式及底层原理
- spring事务的实现方式
spring框架提供了两种事务实现方式:编程式事务、声明式事务
编程式事务:在代码中进行事务控制。优点:精度高。缺点:代码耦合度高
声明式事务:通过@Transactional注解实现事务控制 - spring事务的底层原理
事务的操作本来应该由数据库进行控制,但是为了方便用户进行业务逻辑的控制,spring对事务功能进行了扩展实现。一般我们很少使用编程式事务,更多的是使用@Transactional注解实现。当使用了@Transactional注解后事务的自动功能就会关闭,由spring帮助实现事务的控制。
Spring的事务管理是通过AOP代理实现的,对被代理对象的每个方法进行拦截,在方法执行前启动事务,在方法执行完成后根据是否有异常及异常的类型进行提交或回滚。
Spring AOP动态代理机制:
Spring在运行期间会为目标对象生成一个代理对象,并在代理对象中实现对目标对象的增强。
SpringAOP通过两种动态代理机制,实现对目标对象执行横向植入的。
代理技术 描述
JDK 动态代理 Spring AOP 默认的动态代理方式,若目标对象实现了若干接口,Spring 使用 JDK 的 java.lang.reflect.Proxy 类进行代理。
CGLIB 动态代理 若目标对象没有实现任何接口,Spring 则使用 CGLIB 库生成目标对象的子类,以实现对目标对象的代理。
原理:当在某个类或者方法上使用@Transactional注解后,spring会基于该类生成一个代理对象,并将这个代理对象作为bean。当调用这个代理对象的方法时,如果有事务处理,则会先关闭事务的自动功能,然后执行方法的具体业务逻辑,如果业务逻辑没有异常,那么代理逻辑就会直接提交,如果出现任何异常,那么直接进行回滚操作。当然我们也可以控制对哪些异常进行回滚操作。
底层原理图:
Spring事务实现的方式及底层原理相关推荐
- Spring事务的实现方式和实现原理
Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.Spring只提供统一事务管理接口,具体实现都是由各数据库自己实现,数据库事务的提交和回滚是通 ...
- 一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 31.线程池复用的原理 32.spring是什么? 33.对Aop的理解 34.对IOC的理解 35.BeanFactor ...
- 【MySQL进阶】MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!)
[MySQL进阶]MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!) 参考资料: 美团技术团队:Innodb中事务隔离级别和锁的关系 数据库的锁,到底锁的是什么? 阿里面试:说说一致性读实现原 ...
- Spring事务的实现方式
什么是事务? 说到事务,一般指的都是数据库中的事务. 是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作. 这些操作作为一个整体一起向系统提交,要么都执行.要么都不执行. 事务是一组不 ...
- JAVA→HashMap、常用方法、遍历方式、底层原理、初始化性能分析
Map方法 HashMap HashMap()遍历 HashMap()四种遍历性能分析 HashMap()底层原理 HashMap()是否初始化大小性能分析 LinkedHashMap()
- 【Spring系列】- Bean生命周期底层原理
Bean生命周期底层原理
- spring 事务的实现方式和原理_spring整合atomikos实现分布式事务
前言 Atomikos 是一个为Java平台提供增值服务的并且开源类事务管理器,主要用于处理跨数据库事务,比如某个指令在A库和B库都有写操作,业务上要求A库和B库的写操作要具有原子性,这时候就可以用到 ...
- springaop事务逻辑原理_架构师:一篇文章掌握——Spring 事务管理
对大多数Java开发者来说,Spring事务管理是Spring应用中最常用的功能,使用也比较简单.本文主要逐步介绍Spring事务管理的相关知识点及原理,作为Spring事务管理的学习总结. 一.关键 ...
- Spring事务配置的五种方式 说明
Spring事务配置的五种方式 [转 http://blog.csdn.net/hjm4702192/article/details/17277669] Spring配置文件中关于事务配置总是由三个 ...
最新文章
- tf.keras.losses.CategoricalCrossentropy 多分类 交叉熵 损失函数示例
- java中setDocument_Java ActionItem.setDocumentId方法代码示例
- 阿里云Redis混合存储典型场景:如何轻松搭建视频直播间系统
- Visual Studio中相对路径中的宏定义,你不了解的宏定义都在这里!
- csv导入mysql phpmyadmin_关于mysql:使用phpMyAdmin导入大型csv文件
- Spark学习之路 (二十三)SparkStreaming的官方文档
- dd wrt php,HG255D(DDWRT)挂载U盘安装emlog和Discuz!教程
- 计算机控制系统与常规仪表控制系统的主要异同点,计算机控制统考试.doc
- Pspice仿真模型创建
- Linux服务器中查询IP地址五个方法
- 计算机cpu结构实物图片,cpu内部结构显微图/cpu内部结构放大图
- Django文档是如何组织的?
- c4d怎么导入fbx_c4d怎么导入模型?品索教你Maya模型文件如何导入到C4d
- 然而,随着下属人数的增多,下属各自 开始形成自己的权力主体。
- 请编程序将china译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如:字母A后面4个字母为E,因此,China应译为Glmre。
- 华为RH2288H V3服务器更换内存条
- c语言分离个位十位百位_C语言中 将一个3位数整数,正确分离出它的个位、十位和百位数字,并分别在屏幕上输出...
- PHPexcel 导出身份证处理
- 掘地三尺搞定 Redis 与 MySQL 数据一致性问题
- 【自学Java】Java数据类型
热门文章
- 暖通空调的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 自己实现atoi函数
- 距阵乘以一个未知距阵得单位矩阵 怎么算_一个人可以 DIY 出什么高逼格的东西?...
- 基于jsp(java)网络教学平台系统的设计与实现
- java里break的使用方法_java中break,continue,return使用方法
- LINUX内核编译(ZT)
- Cisco Packet Tracer的简单使用
- win10在此计算机上找不到系统映像,图文教你win10系统使用DISM修复找不到源的问题....
- Cisco忘了enable密码怎么办
- VScode 一些快捷操作 删除空行