Spring 事务底层原理
一、声明式事务:
/**
* 声明式事务:
*
* 环境搭建:
* 1、导入相关依赖
* 数据源、数据库驱动、Spring-jdbc模块
* 2、配置数据源、JdbcTemplate(Spring提供的简化数据库操作的工具)操作数据
* 3、给方法上标注 @Transactional 表示当前方法是一个事务方法;
* 4、 @EnableTransactionManagement 开启基于注解的事务管理功能;
* @EnableXXX
* 5、配置事务管理器来控制事务;
* @Bean
* public PlatformTransactionManager transactionManager()
*
*
* 原理:
* 1)、@EnableTransactionManagement
* 利用TransactionManagementConfigurationSelector给容器中会导入组件
* 导入两个组件
* AutoProxyRegistrar
* ProxyTransactionManagementConfiguration
* 2)、AutoProxyRegistrar:
* 给容器中注册一个 InfrastructureAdvisorAutoProxyCreator 组件;
* InfrastructureAdvisorAutoProxyCreator:?
* 利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用;
*
* 3)、ProxyTransactionManagementConfiguration 做了什么?
* 1、给容器中注册事务增强器;
* 1)、事务增强器要用事务注解的信息,AnnotationTransactionAttributeSource解析事务注解
* 2)、事务拦截器:
* TransactionInterceptor;保存了事务属性信息,事务管理器;
* 他是一个 MethodInterceptor;
* 在目标方法执行的时候;
* 执行拦截器链;
* 事务拦截器:
* 1)、先获取事务相关的属性
* 2)、再获取PlatformTransactionManager,如果事先没有添加指定任何transactionmanger
* 最终会从容器中按照类型获取一个PlatformTransactionManager;
* 3)、执行目标方法
* 如果异常,获取到事务管理器,利用事务管理回滚操作;
* 如果正常,利用事务管理器,提交事务
*
*/
二、Spring 事务原理
二、事务传播行为类型
说明
PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
三、spring事务失效的原因
1、数据库引擎不支持事务
2、没有被 Spring 管理
3、方法不是 public 的
When using proxies, you should apply the @Transactional annotation only to methods with public visibility. If you do annotate protected, private or package-visible methods with the @Transactional annotation, no error is raised, but the annotated method does not exhibit the configured transactional settings. Consider the use of AspectJ (see below) if you need to annotate non-public methods.
4、自身调用问题
发生了自身调用,就调该类自己的方法,而没有经过 Spring 的代理类,默认只有在外部调用事务才会生效
5、数据源没有配置事务管理器
6、@Transactional中的事务传递配置错误
7、异常被吃了,方法A引用支持事务的方法B,但是catch了方法B的异常,导致B事务失效
8、异常类型错误
默认回滚的是:RuntimeException,如果你想触发其他异常的回滚,需要在注解上配置一下,如:
@Transactional(rollbackFor = Exception.class)
这个配置仅限于 Throwable 异常类及其子类。
Spring 事务底层原理相关推荐
- 【JAVA SE】第十七章 反射、注解与Spring事务底层原理
第十七章 反射.注解与Spring事务底层原理 文章目录 第十七章 反射.注解与Spring事务底层原理 一.反射 1.简介 2.意义 3.缺点 4.应用场景 5.反射技术的使用 二.注解 1.概念 ...
- Spring 事务底层原理,你会了吗?
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:八个开源的 Spring Boot 学习资源,你值得拥有个人原创+1博客:点击前往,查看更多 作者:香沙小熊 链 ...
- Spring Cloud底层原理(转载 石杉的架构笔记)
拜托!面试请不要再问我Spring Cloud底层原理 原创: 中华石杉 石杉的架构笔记 目录 一.业务场景介绍 二.Spring Cloud核心组件:Eureka 三.Spring Cloud核心组 ...
- 10. Spring IOC 底层原理
Spring IOC 底层原理 如何通过 IOC 容器来创建对象: 创建 Maven 工程,在 pom.xml 中添加 Spring 框架相关的依赖: 新建实体类: 在 resources 目录下创建 ...
- 一文彻底搞懂事务底层原理
事务底层原理(INNODB) 前言 redo log 为什么需要 redo log 一些问题 重做日志结构 重做日志文件结构 log group与循环写入 日志何时写入磁盘? 数据恢复:LSN标记 C ...
- 分析Spring事务管理原理及应用
目录 一.Spring事务管理介绍 (一)基本理论 (二)实际工作中的举例 (三)简单应用举例 二.Spring事务配置介绍 (一)Spring事务属性介绍 传播属性(传播行为)可选值说明 (二)声明 ...
- 阿里二面:了解 MySQL 事务底层原理吗
你好,我是坤哥,今天是国庆最后一天,不知大家是否玩得尽兴,我基本在家带娃了,累得半死,顺带肝了一篇文,来自读者曾经在阿里的面试题,希望对大家有帮助,另外也欢迎大家加我微信「geekoftaste」,一 ...
- Spring 事务传播原理及数据库事务操作原理
相关内容: 架构师系列内容:架构师学习笔记(持续更新) 先看看 Spring 事务的基础配置 <beans xmlns="http://www.springframework.org/ ...
- Spring事务实现原理
对于一个应用而言,事务的使用基本是不可避免的.虽然Spring给我们提供了开箱即用的事务功能-- @Transactional . 但是,自带的事务功能却也存在控制粒度不够的缺点.更糟糕的是, @Tr ...
最新文章
- 在windows8 上安装framework 3.5
- 揭开ITIL 4的神秘面纱,引领企业数字化转型
- matlab mandrill,MATLAB】MATLAB的自带数据及可生成数据的函数
- 记录踩过的坑——代理IP
- leetcode —— 面试题 04.03. 特定深度节点链表
- 转:怎样开始学习php代码审计?
- python百度人脸识别_python 与 百度人脸识别api
- 使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解
- 《layui宇宙版教程》:分页组件laypage
- java代码生成可识别二维码
- react native 随手记之打包遇到坑
- jacob 插入水印方法整理
- 计算机制作贺卡教案,WORD电子贺卡制作的优秀教案_电子贺卡
- java8 利用reduce实现将列表中的多个元素的属性求和并返回
- 基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验
- linux link/symlink/unlink 硬连接和软连接介绍
- 501 -- Introduction to Unsupervised Method
- 线段树(详细注释—pushdown写法)
- 切面条(对折切面条)
- 真爱永远不是遇见的,真爱是养成的
热门文章
- pip install速度很慢怎么办
- 巴黎圣母院大火 中国消防机器人已在防火救火中大显身手
- BT5:DecoratorNodes源码解析
- 在 Windows 中启用自动登录功能
- 计算机很快就会冷却,不会产生热量
- loadrunner入门教程(1)--概述
- 给“算法驱动”换个名叫“私人订制”的发型
- Matlab实现神经网络(附上完整仿真源码)
- 生活随笔:发现微博账号名和自己名一样
- python3**2的值_Python表达式3**2**3的值为_______________。