Spring超详细讲解事务和事务传播机制

目录
  • 为什么需要事务
  • Spring 声明事务
    • Transactional参数说明
      • propagation
      • isolation
      • timeout
    • 事务回滚失效解决方案
    • @Transactional工作原理
  • Spring 事务的传播机制
    • 为什么需要事务传播机制?
    • 传播机制的类型

为什么需要事务

事务是将一组操作封装成一个执行单元,要么全部成功,要么全部失败。如果没有事务,转账操作就会出现异常,因此需要保证原子性。

Spring 声明事务

  • 只需要在方法上添加@Transactional注解就可以实现,无需手动开启和提交事务,如果中途发生异常就会自动回滚事务。
  • @Transactional既可以修饰方法也可以修饰类,修饰方法只能修饰public方法
  • 注意:@Transactional在异常被捕获的情况下,事务就不会自动回滚
@Transactional(isolation = Isolation.READ_COMMITTED) // 开启事务
    @RequestMapping("/insert")
    public int insert(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        return userService.add(userInfo);
    }
    @Transactional(isolation = Isolation.READ_COMMITTED) // 开启事务
    @RequestMapping("/insert2")
    public int insert2(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        int result = userService.add(userInfo);
        System.out.println("MySQL影响的行数:"+result);
        int num = 10/0;
        return result;
    }

Transactional参数说明

propagation

事务的传播行为,默认为Propagation.REQUIRED

isolation

Spring有5种隔离级别,MySQL有四种隔离级别,Spring多了一个DEFAULT,以连接的数据库的事务隔离级别为主

timeout

表示事务的超时时间,默认值为-1,如果事务执行时间超过超时时间,就会自动回滚

事务回滚失效解决方案

直接抛出异常

    @Transactional(propagation = Propagation.REQUIRED) // 开启事务
    @RequestMapping("/insert2")
    public int insert2(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        int result = userService.add(userInfo);
        System.out.println("MySQL影响的行数:"+result);
        try {
            int num = 10/0;
        }catch (Exception e){
            result = 0;
            e.printStackTrace();
            throw e;//解决事务失效的问题
           // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return result;
    }

在catch中使用代码手动进行事务的回滚操作

      @Transactional(propagation = Propagation.REQUIRED) // 开启事务
    @RequestMapping("/insert2")
    public int insert2(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        int result = userService.add(userInfo);
        System.out.println("MySQL影响的行数:"+result);
        try {
            int num = 10/0;
        }catch (Exception e){
            result = 0;
            e.printStackTrace();
            //throw e;//解决事务失效的问题
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return result;
    }

@Transactional工作原理

@Transactional是基于AOP实现的,AOP又是使用动态代理实现的。如果目标对象实现了接口,默认情况下会采用JDK的动态代理,如果目标对象没有实现了接口,会使用CGLIB动态代理。

@Transactional在开始执行业务之前,通过代理先开启事务,在执行成功之后再提交事务。如果中途遇到了异常,则回滚事务。

Spring 事务的传播机制

定义:Spring中多个事务相互调用时,他们之间的行为方式是如何执行的

为什么需要事务传播机制?

事务的隔离级别是保证多个并发事务执行的可控性(稳定性),而事务传播机制是保证一个事务在多个调用方法间的可控性

传播机制的类型

嵌套事务和加入事务的区别

  • 整个事务如果全部执行成功,二者的结果是一样的
  • 如果事务执行到一半失败了,那么加入事务整个事务会全部回滚;而嵌套事务会局部回滚,不会影响上一个方法中执行的结果

到此这篇关于Spring超详细讲解事务和事务传播机制的文章就介绍到这了,更多相关Spring事务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈SpringBoot之事务处理机制

    一.Spring的事务机制 所有的数据访问技术都有事务处理机制,这些技术提供了API用来开启事务.提交事务来完成数据操作,或者在发生错误的时候回滚数据. 而Spring的事务机制是用统一的机制来处理不同数据访问技术的事务处理.Spring的事务机制提供了一个PlatformTransactionManager接口,不同的数据访问技术的事务使用不同的接口实现: 在程序中定义事务管理器的代码如下: @Bean public PlatformTransactionManager transaction

  • 老生常谈spring的事务传播机制

    目录 spring的事务传播机制 1.why 为什么会有事务传播机制? 2.传播机制生效的条件 解决方案 3.传播机制类型 PROPAGATION_REQUIRED (默认) REQUIRES_NEW (一般用在子方法需要单独事务) NESTED SUPPORTS NOT_SUPPORTED MANDATORY NEVER spring的事务传播机制 背景:实习期间几次遇到事务方法,有一次本地测试时发现事务没有回滚,就把简单描述写在wx上,今天来给spring事务做个自我总结. 1.why 为什

  • Spring的事务机制实例代码

    本文研究的主要是Spring的事务机制的相关内容,具体如下. JAVA EE传统事务机制 通常有两种事务策略:全局事务和局部事务.全局事务可以跨多个事务性资源(即数据源,典型的是数据库和消息队列),通常都需要J2EE应用服务器的管理,其底层需要服务器的JTA支持.而局部事务则与底层采用的持久化技术有关,如果底层直接使用JDBC,需要用Connection对象来操事务.如果采用Hibernate持久化技术,则需要使用session对象来操作事务. 通常的,使用JTA事务,JDBC事务及Hibern

  • spring事务隔离级别、传播机制以及简单配置方式

    一.spring支持的事务声明方式 1. 编程式事务 当系统需要明确的,细粒度的控制各个事务的边界,应选择编程式事务. 2. 声明式事务 当系统对于事务的控制粒度较粗时,应该选择申明式事务,通过<tx>标签和<aop>切面形式在xml中进行配置. 3. 无论你选择上述何种事务方式去实现事务控制,spring都提供基于门面设计模式的事务管理器供选择,如下是spring事务中支持的事务管理器 事务管理器实现(org.springframework.*) 使用时机 jdbc.dataso

  • Spring数据库事务的实现机制讲解

    目录 事务控制的核心--Connection 用AOP技术保持当前的Connection Service层和Dao层共享Connection 事务为什么要切在Service层的理由 spring事务与数据库事务的区别 事务控制的核心--Connection 在开始之前,先让我们回忆一下数据库较原始的JDBC是怎么管理事务的: //仅做演示,代码不完整,不完全规范 try { con.setAutoCommit(false); statement1 = con.prepareStatement(s

  • Spring超详细讲解事务

    目录 什么是事务 事务的四个特性(ACID) Spring对事务的支持 编程式事务管理 声明式事务管理 基于注解的声明式事务管理 Spring事务管理的三个接口 Spring事务属性 什么是事务 一个数据库事务是一个被视为一个工作单元的逻辑上的一组操作,这些操作要么全部执行,要么全部不执行. 需要注意的是,并不是所有的数据库(引擎)都支持事务,比如说MySQL的MyISAM存储引擎 事务的四个特性(ACID) 原子性:事务是一个原子性操作,一个事务由一系列操作组成,这一系列操作要么全部执行完成,

  • Spring超详细讲解事务和事务传播机制

    目录 为什么需要事务 Spring 声明事务 Transactional参数说明 propagation isolation timeout 事务回滚失效解决方案 @Transactional工作原理 Spring 事务的传播机制 为什么需要事务传播机制? 传播机制的类型 为什么需要事务 事务是将一组操作封装成一个执行单元,要么全部成功,要么全部失败.如果没有事务,转账操作就会出现异常,因此需要保证原子性. Spring 声明事务 只需要在方法上添加@Transactional注解就可以实现,无

  • Spring超详细讲解IOC与解耦合

    目录 前言 一.所谓耦合 二.Spring 三.核心IOC理解 1.容器 2.控制反转 3.依赖注入 四.Bean的实例化 1.无参构造 2.工厂静态方法 3.工厂实例方法(常用) 五.Bean的依赖注入 1.set注入 2.有参构造 六.第一个Spring案例 前言 回想写过的图书管理系统.租房系统.电影院卖票系统都是基于原生的JavaSE.OOP,没有用到任何框架,在层与层的关系中一个类要想获得与其他类的联系主要的方式还是靠new,这就导致层与层之间.对象与对象之间的依赖性强“动一发而迁全身

  • Spring超详细讲解创建BeanDefinition流程

    目录 一.前期准备 1.1 环境依赖 1.2 实体类 1.3 applicationContext.xml 1.4 测试代码 二.探究过程 2.1 目标 2.2 BeanDefinition的创建过程 2.2.1 回顾bean对象的创建 2.2.2 AbstractApplicationContext 2.2.3 AbstractXmlApplicationContext 2.2.4 AbstractBeanDefinitionReader 2.2.5 XmlBeanDefinitionRead

  • Spring超详细讲解BeanUtils改造

    目录 1.基本原理 2.使用 3.性能 4.提醒 1.基本原理 原理:https://www.jb51.net/article/252384.htm 浅拷贝:https://www.jb51.net/article/221283.htm BeanUtils.copyProperties();确实为我们做了很多事情,虽然不能完美完成深拷贝,但是对于 po.vo.dto 的拷贝已经足够用了.但是其还是有一些不够完美的地方. 不足几点如下: 不能拷贝 list,而拷贝 list 的情况又大量存在,因此

  • Spring超详细讲解面向对象到面向切面

    目录 前言 一.OOP&AOP 二.AOP核心 三.第一个AOP案例 1.环境准备 2.AOP实现步骤 四.切入点表达式 1.语法格式 2.通配符 五.AOP通知类型 环境准备 环绕通知 1.返回后通知 2.异常后通知 前言 Object object = new Object(); 世间万物的本质都可看作类的对象,面向对象(OOP)的模式让程序易维护.易复用.易扩展,而面向切面(AOP)则是面向对象的补充,让对象的功能更加强大 对比前面的日志框架技术二者非常相似,他的特点就是在不影响业务的前提

  • Spring超详细讲解注解开发

    目录 1.使用注解开发 1.1.Bean的实现 1.2.属性注入 1.3.衍生注解 1.4.自动装配注解 1.5.作用域 1.6.小结 2.基于Java类进行配置 1.使用注解开发 说明 在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spring

  • Spring超详细讲解AOP面向切面

    目录 简介 AOP底层原理 代理概念 JDK动态代理实现 Spring中的AOP 相关术语 AspectJ 实现AOP 不同通知类型实现 相同的切入点抽取 增强类优先级 完全使用注解开发 说明:基于atguigu学习笔记. 简介 AOP(Aspect Oriented Programming)是一种面向切面的编程思想.不同于面向对象里的继承思想,当需要为多个不具有继承关系的对象引人同一个公共行为时,也就是把程序横向看,寻找切面,插入公共行为. AOP目的是为了些把影响了多个类的公共行为抽取到一个

  • SpringBoot超详细讲解事务管理

    目录 1. 事务的定义 2. 事务的特性 3. 事务的隔离性 4. 事务管理 5. 示例 1. 事务的定义 事务是由 N 步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行. 2. 事务的特性 事务的 ACID 特性: 原子性:事务是应用中不可分割的最小执行体 一致性:事务执行的结果必须使得数据从一个一致性状态转变为另一个一致性状态 隔离性:各个事务的执行互不干扰,任何事务的内部操作对其他事务都是隔离的 持久性:事务一旦提交,对数据所做的任何修改都要记录到永久存储器中

  • Java 超详细讲解核心类Spring JdbcTemplate

    目录 JdbcTemplate概述 JdbcTemplate开发步骤 JdbcTemplate快速入门 Spring产生JdbcTemplate对象 JdbcTemplate的常用操作 修改操作 删除和查询全部操作 查询单个数据操作 本章小结 JdbcTemplate概述 它是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装.spring框架为我们提供了很多的操作 模板类.例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nos

随机推荐