广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring详细解读事务管理
  • 777
分享到

Spring详细解读事务管理

2024-04-02 19:04:59 777人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是事务spring事务配置Spring事务传播行为1. PROPAGATioN_REQUIRED2. PROPAGATION_SUPPORTS3. PROPAGATION_R

什么是事务

事务就是对数据库若干操作组成的一个单元

       我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操作数据的并不可靠,需要在这种情况下进行回退

       事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态,这些操作要么都完成,要么都取消,从而保证数据满足一致性的要求

如何理解呢 ? 

例如 :  A现在要转账给B  那么转账是几个方法呢? 两个 : 方法1: A 减钱  方法2: B加钱 

      如果A方法成功执行后 , B方法中执行时出现了异常, 就等于A钱扣了却没有给B加钱, 那么这样的行为肯定是不允许的, 所以我们引入事务的概念 , 事务一般也是对于数据库而言的

Spring事务配置

Spring事务管理又分为编程式事务和声明式事务

       编 程 式 事 务 在 项 目 中 很 少 使 用 , 这 种 方 式 需 要 注 入 一 个 事 务 管 理 对 象 TransactionTemplate ,然后在我们代码中需要提交事务或回滚事务时自己写代码实现

       声明式事务管理建立在 aop 基础上,本质是对方法前后进行拦截,所以声明式事务是方法级别的。

为什么说是基于AOP呢? 因为在通过xml文件配置中我们是这样来做的

<aop:config> 
<aop:pointcut expression="execution(* com.ff.spring.service.UserService.*(..))" id="allmethod"/> 
<aop:advisor advice-ref="txadvice" pointcut-ref="allmethod"/> 
</aop:config>

基于注解的方式直接帮我们省略了这个过程, 更为方便

这里我们主要介绍声明式事务

首先在db.xml中配置spring事务管理类

<!--配置spring事务管理类-->
    <bean id="sourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="druidDataSource"/>
    </bean>

这里我们直接介绍基于注解方式的spring事务管理

开启注解扫描

<!-- 开启注解事务管理 --> 
<tx:annotation-driven transaction-manager="sourcetransactionManager"/>

      我们使用@Transactiona  这样一个注解标签来声明事务, 它可以作用于方法,表明这个方法支持事务, 也可以作用于类, 表明这个类中的所有方法支持事务

public class UserDao {
    @Autowired
    JdbcTemplate jdbcTemplate;
    @Transactional(propagation= Propagation.REQUIRED)
    public void saveUser(){
        jdbcTemplate.update("insert into admin(account,pass_Word,sex) values (?,?,?)","li","111","男");
        int i=108/0;  //出现异常
        jdbcTemplate.update("insert into admin(account,pass_word,sex) values (?,?,?)","qw","111","男");
    }
}

       在上述代码中, 第一条sql 语句虽然成功执行, 但后面出现了异常, 所以这个方法的事务并没有提交, 是不会向数据库提交数据的

Spring事务传播行为

       即然是传播,那么至少有两个东西,才可以发生传播。单体不存在传播这个行为。事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。事务传播行为是 Spring 框架独有的事务增强特性,他不属于的事务实际提供方数据库行为.

      是不是有点懵, 说啥呢这是, 接着来解释

      试想 , 有两个方法 A 和 B , 它们都有事务, 那么我在 A 方法中去调用 B 方法, 那么B方法此时

应该怎样去执行呢? 是将B 方法加入到 A 方法组成一个事务,还是它们都是一个独立的事务呢 ?

       Spring定义了 7种 事务传播行为, 我们下面主要介绍其中三种,都会举例说明

       传播行为一般是对于B方法(被调用的方法而言的)

1. PROPAGATION_REQUIRED

指定的方法必须在事务内执行,若当前存在事务,加入到当前事务中,若当前没有事务,则创建一个新事务,这种传播行为是最常见的,也是 spring 默认的传播行为

        A 方法调用 B方法(PROPAGATION_REQUIRED) , 如果A方法是存在事务的, 那么直接将B方

法加入到 A事务中,组成一个事务.  如果 A 方法是没有事务的, 那么B就是一个单独的事务

        这么说可能有点绕 , 我们再次请出李雷, 算了, 这次就放过李雷, 换成张三吧

        就是说呢 , 我和李雷现在都要去吃饭, 然后我说呢,李雷咱俩一起吧(A调用B,我叫李雷去吃饭) , 不出意外的话(事务顺利执行提交), 我们两吃饭作为一个整体, 最终都吃了饭(AB都存在事务就作为一个整体事务) , 但是还有一种情况, 我叫李雷去吃饭, 但是我却没有去(A调用B, 但是A没有事务),那么这时候李雷肯定单独去吃饭(B单独开启一个事务)

@Transactional(propagation = Propagation.REQUIRED)
    public void saveDept(){   //A调用B
        deptDao.saveDept();
        commonService.saveLog(); //B
    }
@Transactional(propagation = Propagation.REQUIRED)
    public void saveLog(){
        commonDao.saveLog();
        int a = 10/0; //异常
    }

 此时 A 调用 B , 它们都有事务, B中出了异常, 那么此时AB最终都不会去和数据库交互

//@Transactional(propagation = Propagation.REQUIRED)
    public void saveDept(){   //A调用B
        deptDao.saveDept();
        commonService.saveLog(); //B
    }
@Transactional(propagation = Propagation.REQUIRED)
    public void saveLog(){
        commonDao.saveLog();
        int a = 10/0; //异常
    }

      第二种方式 , 我们将异常加到A 中, 注释掉注解(取消A的事务), 那么此时B是单独的一个事务, B里面出了异常, 不会去和数据库交互, 则A会去和数据库交互

2. PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行

          A方法调用B方法(PROPAGATION_SUPPORTS), 如果A是存在事务的,那么直接将B方

法加入到 A事务中,组成一个事务. 如果 A 没有事务, 那么B也没有事务

      我叫李雷去吃饭 , 如果我一定要去吃饭(A调用B), 那么最终我吃饭和李雷吃饭就总共作为一个事务,就和上面第一个例子是一样的, 作为整体的一个事务. 但是第二种情况就是, 我虽然叫了李雷去吃饭, 但是我最终没有去(A没有事务) , 这时候李雷说, 那我也不去吃饭了(B也没有事务)

@Transactional(propagation = Propagation.REQUIRED)
    public void saveDept(){   //A调用B
        deptDao.saveDept();
        commonService.saveLog(); //B
    }
@Transactional(propagation = Propagation.SUPPORTS)
    public void saveLog(){
        commonDao.saveLog();
        int a = 10/0; //异常
    }

      此时 A调用 B , AB都有事务, 那么B 中出现异常, 最终都不会和数据库交互,就和上述第一种情况

一样

//@Transactional(propagation = Propagation.REQUIRED)
    public void saveDept(){   //A调用B
        deptDao.saveDept();
        commonService.saveLog(); //B
    }

      取消掉A 的事务 , 那么此时B 会以非事务执行 , 这时候AB都会和数据库去交互,因为非事务

3. PROPAGATION_REQUIRES_NEW

总是新建一个事务,如果当前存在事务,把当前事务挂起,直到新建的事务结束。

         A方法调用B方法(PROPAGATION_REQUIRES_NEW), 如果A存在事务, 那么B此时会先把A事务挂起, 然后为自己新建一个事务, 先执行完B事务, 才会去执行 A 事务 . 如果A 没有事务, 那么B自己单独新建一个事务执行

   这里就是, 我虽然叫李雷去吃饭(A调用B) , 李雷都会先自己去吃饭, 不等我(B自己新建一个事务, A有事务先将A挂起)

@Transactional(propagation = Propagation.REQUIRED)
    public void saveDept(){   //A调用B
        deptDao.saveDept();
        commonService.saveLog(); //B
    }
@Transactional(propagation = Propagation.REQUIRES_NEW)
    public void saveLog(){
        commonDao.saveLog();
        int a = 10/0; //异常
    }

      A 调用 B , A支持事务 , 此时B将A事务挂起, 单独开启一个事务,里面出现异常,此时AB都不会和数据库交互

//@Transactional(propagation = Propagation.REQUIRED)
    public void saveDept(){   //A调用B
        deptDao.saveDept();
        commonService.saveLog(); //B
    }

取消A的事务, 但此时B事务是独立的, 出现异常, 所以B不会和数据库交互,但是A和数据库交互

声明式事务失效

事务也是会失效的 , 失效有以下几种情况

1.@Transactional 应用在非 public 修饰的方法上

2.@Transactional 注解属性 propagation 设置错误

3.同一个类中方法调用,导致@Transactional 失效

4.异常被 catch 捕获导致@Transactional 失效

5.数据库引擎不支持事务

非public修饰导致权限错误, 事务失效,  propagation设置参数错误导致事务失效

同类下方法调用也会导致事务失效

catch如果捕获了异常, 就相当于程序没有异常,这时事务也会失效

最后就是数据库引擎不支持, Mysql中只有InnoDB引擎是支持事务的

结语

          关于Spring 事务管理就先说到这 , 后面介绍springMVCSSM 框架, 谢谢,爱你们?学 spring 一定要笑, 笑着学 ,嘿嘿

到此这篇关于Spring详细解读事务管理的文章就介绍到这了,更多相关Spring事务管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Spring详细解读事务管理

本文链接: https://www.lsjlt.com/news/147497.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring详细解读事务管理
    目录什么是事务Spring事务配置Spring事务传播行为1. PROPAGATION_REQUIRED2. PROPAGATION_SUPPORTS3. PROPAGATION_R...
    99+
    2022-11-13
  • Spring事务管理详细讲解
    目录事务回顾spring事务操作基于注解声明事务@Transactional注解使用事务传播机制事务隔离级别@Transactional其他属性基于XML 声明式事务完全注解开发说明...
    99+
    2022-11-13
    Spring事务管理 Spring事务原理 Spring事务管理机制
  • Spring超详细讲解事务
    目录什么是事务事务的四个特性(ACID)Spring对事务的支持编程式事务管理声明式事务管理基于注解的声明式事务管理Spring事务管理的三个接口Spring事务属性什么是事务 一个...
    99+
    2022-11-13
  • Spring基于Aop实现事务管理流程详细讲解
    目录aop在spring事务中的运用基于纯注解实现spring事务管理基于xml文件实现Spring事务管理aop在spring事务中的运用 在Spring中,AOP和事务管理是两个...
    99+
    2023-05-20
    Spring Aop事务管理 Spring实现事务管理
  • 详细谈谈Spring事务是如何管理的
    目录前言Spring事务抽象PlatformTransactionManager是事务管理器接口常见的事务管理器有以下几种定义事务的一些参数: 7种事务传播特性: 四种事务隔离级别:...
    99+
    2022-11-12
  • Spring 事务管理详解及使用
    ✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识...
    99+
    2023-09-02
    spring java mybatis
  • SpringBoot超详细讲解事务管理
    目录1. 事务的定义2. 事务的特性3. 事务的隔离性4. 事务管理5. 示例1. 事务的定义 事务是由 N 步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃...
    99+
    2022-11-13
  • 详细解读Java Spring AOP
    一、对AOP的初印象 首先先给出一段比较专业的术语(来自百度): 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式...
    99+
    2022-11-12
  • 详解Spring学习之编程式事务管理
    前言在前面的内容,基本已经学习了事务的基本概念以及事务隔离级别等,接下来的几个小节,将学习怎么使用Spring进行事务管理,在Spring中,对事务进行管理有多种方法,主要分别编程式和声明式,本小节主要学习编程式事务管理,后面讲学习Spri...
    99+
    2023-05-31
    spring 编程式 事务
  • Spring事务的详细介绍
    本篇内容介绍了“Spring事务的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言Spring事务管理我相信大家都用得很多,但可能...
    99+
    2023-06-04
  • Spring超详细讲解事务和事务传播机制
    目录为什么需要事务Spring 声明事务Transactional参数说明propagationisolationtimeout事务回滚失效解决方案@Transactional工作原...
    99+
    2022-11-13
  • Spring事务管理的使用细则浅析
    目录Spring 事务管理接口1、事务管理器接口 PlatformTransactionManager2、事务定义接口 TransactionDefinitionSpring 事务管...
    99+
    2023-02-27
    Spring事务管理机制 Spring事务管理方式
  • 详谈Spring框架之事务管理
    一、编程式事务二、声明式事务1、基于XML的事务1.1 Spring配置文件 <!-- 配置c3p0数据源,只是进行了最简单的配置 --> <bean id="dataSource" class="com.mchange...
    99+
    2023-05-31
    spring 框架 事务管理
  • Spring详细讲解事务失效的场景
    目录1)未被Spring管理2)数据库引擎不支持事务3)事务方法没有被public修饰4)方法使用final修饰5)同一类中方法调用6)未开启事务7)多线程调用8)错误的传播行为9)...
    99+
    2022-11-13
  • Spring事务失效场景的详细整理
    目录前言数据库引擎不支持事物方法不是 public 的自身调用问题不支持事物异常被吃掉异常类型错误总结前言 项目中用Spring的 @Transactional 注解控制事务,使用中...
    99+
    2022-11-13
  • Spring详细讲解7种事务传播方式
    Spring事务传播行为体现在某个service方法调用另一个service方法,事务该如何进行下去。 Spring支持7中事务传播方式,在Propagation类中可以看到,如下:...
    99+
    2023-01-03
    Spring事务传播 Spring事务传播方式
  • Spring的事务管理
    一、事务的基础知识数据库事务:复杂的事务要分步执行,要么整体生效、要么整体失效。必须满足:原子性、一致性、隔离性、持久性。数据并发问题:脏读:A读取了B未提交的更改数据。    &nbs...
    99+
    2022-10-18
  • Spring的事务详解
    事务简介 事务在逻辑上是一组操作,要么执行,要不都不执行。主要是针对数据库而言的,比如说 MySQL。 为了保证事务是正确可靠的,在数据库进行写入或者更新操作时,就必须得表现出 ACID 的 4 个重要特性: 原子性(Atomicity):...
    99+
    2023-08-20
    spring java
  • Spring的事务管理你了解吗
    目录1、事务介绍2、事务的四个特性(ACID)3、Spring 事务管理的核心接口4、PlatformTransactionManager 事务管理器5、TransactionSta...
    99+
    2022-11-13
  • Spring事务的开启原理详解
    目录@EnableTransactionManagement开启事务原理解析总结 在事务配置类上声明@EnableTransactionManagement注解开启事务 在事...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作