一、声明式事务:

/**
* 声明式事务:
*
* 环境搭建:
* 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 事务底层原理相关推荐

  1. 【JAVA SE】第十七章 反射、注解与Spring事务底层原理

    第十七章 反射.注解与Spring事务底层原理 文章目录 第十七章 反射.注解与Spring事务底层原理 一.反射 1.简介 2.意义 3.缺点 4.应用场景 5.反射技术的使用 二.注解 1.概念 ...

  2. Spring 事务底层原理,你会了吗?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:八个开源的 Spring Boot 学习资源,你值得拥有个人原创+1博客:点击前往,查看更多 作者:香沙小熊 链 ...

  3. Spring Cloud底层原理(转载 石杉的架构笔记)

    拜托!面试请不要再问我Spring Cloud底层原理 原创: 中华石杉 石杉的架构笔记 目录 一.业务场景介绍 二.Spring Cloud核心组件:Eureka 三.Spring Cloud核心组 ...

  4. 10. Spring IOC 底层原理

    Spring IOC 底层原理 如何通过 IOC 容器来创建对象: 创建 Maven 工程,在 pom.xml 中添加 Spring 框架相关的依赖: 新建实体类: 在 resources 目录下创建 ...

  5. 一文彻底搞懂事务底层原理

    事务底层原理(INNODB) 前言 redo log 为什么需要 redo log 一些问题 重做日志结构 重做日志文件结构 log group与循环写入 日志何时写入磁盘? 数据恢复:LSN标记 C ...

  6. 分析Spring事务管理原理及应用

    目录 一.Spring事务管理介绍 (一)基本理论 (二)实际工作中的举例 (三)简单应用举例 二.Spring事务配置介绍 (一)Spring事务属性介绍 传播属性(传播行为)可选值说明 (二)声明 ...

  7. 阿里二面:了解 MySQL 事务底层原理吗

    你好,我是坤哥,今天是国庆最后一天,不知大家是否玩得尽兴,我基本在家带娃了,累得半死,顺带肝了一篇文,来自读者曾经在阿里的面试题,希望对大家有帮助,另外也欢迎大家加我微信「geekoftaste」,一 ...

  8. Spring 事务传播原理及数据库事务操作原理

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 先看看 Spring 事务的基础配置 <beans xmlns="http://www.springframework.org/ ...

  9. Spring事务实现原理

    对于一个应用而言,事务的使用基本是不可避免的.虽然Spring给我们提供了开箱即用的事务功能-- @Transactional . 但是,自带的事务功能却也存在控制粒度不够的缺点.更糟糕的是, @Tr ...

最新文章

  1. 在windows8 上安装framework 3.5
  2. 揭开ITIL 4的神秘面纱,引领企业数字化转型
  3. matlab mandrill,MATLAB】MATLAB的自带数据及可生成数据的函数
  4. 记录踩过的坑——代理IP
  5. leetcode —— 面试题 04.03. 特定深度节点链表
  6. 转:怎样开始学习php代码审计?
  7. python百度人脸识别_python 与 百度人脸识别api
  8. 使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解
  9. 《layui宇宙版教程》:分页组件laypage
  10. java代码生成可识别二维码
  11. react native 随手记之打包遇到坑
  12. jacob 插入水印方法整理
  13. 计算机制作贺卡教案,WORD电子贺卡制作的优秀教案_电子贺卡
  14. java8 利用reduce实现将列表中的多个元素的属性求和并返回
  15. 基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验
  16. linux link/symlink/unlink 硬连接和软连接介绍
  17. 501 -- Introduction to Unsupervised Method
  18. 线段树(详细注释—pushdown写法)
  19. 切面条(对折切面条)
  20. 真爱永远不是遇见的,真爱是养成的

热门文章

  1. pip install速度很慢怎么办
  2. 巴黎圣母院大火 中国消防机器人已在防火救火中大显身手
  3. BT5:DecoratorNodes源码解析
  4. 在 Windows 中启用自动登录功能
  5. 计算机很快就会冷却,不会产生热量
  6. loadrunner入门教程(1)--概述
  7. 给“算法驱动”换个名叫“私人订制”的发型
  8. Matlab实现神经网络(附上完整仿真源码)
  9. 生活随笔:发现微博账号名和自己名一样
  10. python3**2的值_Python表达式3**2**3的值为_______________。