Web 事务管理

这篇具有很好参考价值的文章主要介绍了Web 事务管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Web在执行的过程中需要保证一致性,从而需要引入事务来对SQL事件进行事务的管理。具体而言可以参考这篇博客MySQL事务(transaction)。

具体而言,我们获得一个这样的需求,删除一个部门,在删除部门的过程中需要删除部门下的所有员工

@Override
public void delete(Integer id)
    {
        // 由于这里要执行两端删除代码,为了保证一致性
        // 外面使用事务的方法进行封装与回滚
        deptMapper.delete(id);
        empMapper.deleteEmpByDeptId(id);
    }

正常而言这段代码是可以正常执行的,但是我们在中间引入一个错误,即在两个请求过程中加入一个运行时错误,此时deptMapper.delete(id);执行成功,empMapper.deleteEmpByDeptId(id);执行失败,这时部门删除了,但是该部门下的所有员工并没有删除(这就导致了数据库的不一致性)。

    @Override
    @Transactional
    public void delete(Integer id)
    {
        // 由于这里要执行两端删除代码,为了保证一致性
        // 外面使用事务的方法进行封装与回滚
        deptMapper.delete(id);
        int i =1/0;
        empMapper.deleteEmpByDeptId(id);
    }

SpringBoot中的事务管理

为此我们引入SpringBoot中的事务管理,它是通过@Transactional进行注解标注的,有个这个注解整个函数包裹的部分变成一个事务。
在这里插入图片描述

    @Override
    @Transactional
    public void delete(Integer id)
    {
        // 由于这里要执行两端删除代码,为了保证一致性
        // 外面使用事务的方法进行封装与回滚
        deptMapper.delete(id);
        int i =1/0;
        empMapper.deleteEmpByDeptId(id);
    }

为了观察到日志,我们在application.yml引入事务管理日志。

logging:
  level:
    org.springframework.jdbc.support.jdbtTransactionManager: debug

执行上述代码可以看到:
运行时错误,同时整个事务进行了回滚。(同时数据库中的两个表都没有进行删除)
Web 事务管理,JAVA后端,前端,数据库,java

事务管理——rollbackFor

默认情况下@Transactional只会在系统出现运行时错误(RuntimeException)才会回滚(1/0操作就是典型的运行时错误)。
像下面,如果我们自己定义一个异常,事务是不会出现回滚的。

    @Override
    @Transactional
    public void delete(Integer id) throws Exception
    {
        // 由于这里要执行两端删除代码,为了保证一致性
        // 外面使用事务的方法进行封装与回滚
        deptMapper.delete(id);
        if(true)
        	throw new Exception("一个错误");
        empMapper.deleteEmpByDeptId(id);
    }

为此我们就需要引入rollbackFor,来定义回滚时的错误。

@Transactional(rollbackFor = Exception.class)

在注解上添加rollbackFor = Exception.class,告诉事务,遇见所有异常我都要进行回滚。

事务管理——propagation 事务传播行为

事务传播行为:指的是一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。
主要有这些事务属性
Web 事务管理,JAVA后端,前端,数据库,java
一般而言,我们知道两个就行REQUIRED、REQUIRES_NEW。
Web 事务管理,JAVA后端,前端,数据库,java

例如我这里的需求是解散部门,同时无论成功失败,都需要将记录写在操作日志上
那我们的步骤就总共为两部:1.解散部门和员工、2.记录日志到数据库

@Override
    @Transactional(rollbackFor = Exception.class)
    public void delete(Integer id) throws Exception
    {
        // 由于这里要执行两端删除代码,为了保证一致性
        // 外面使用事务的方法进行封装与回滚

        try {
            deptMapper.delete(id);
            int i = 1/0;
            empMapper.deleteEmpByDeptId(id);
        }
        finally {

            LocalDate createTime = LocalDate.now();
            String description = "执行了解散部门的操作,解散的部门为"+id;
            deptMapper.insertDeptLog(createTime,description);
        }
        
    }

日志记录我们这里也是一个@Transactional注解的方法

@Transactional
public void insertDeptLog(LocalDate createTime,String description);

将这个记录的方法放在了finally {}中,无论成功失败我们都要执行,但是操作这个代码发现,日志上并没有记录。
原因是这两个@Transactional默认都是REQUIRED类型,首先执行void delete(Integer id) throws Exception代码,其自动为自己创建一个Transactional;当执行到finally {}中的void insertDeptLog(LocalDate createTime,String description)时候,insertDeptLog发现目前自己已经在一个事务中运行了,则不会创建新的事物,这导致两端代码同时回滚。

为了解决这个问题,则需要对insertDeptLog中注解声明参数REQUIRES_NEW,告诉系统,无论外面有没有事物,我都会自己创建一个事物。文章来源地址https://www.toymoban.com/news/detail-665182.html

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void insertDeptLog(LocalDate createTime,String description);

到了这里,关于Web 事务管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL:事务、索引、用户管理、备份、数据库设计(三大范式)

    事务 (transaction):要么都成功,要么都失败。 核心 :将一组 SQL 放在一个批次中去执行。 原则 ACID :原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。 原子性 :一个事务中的所有步骤 要么都 成功, 要么都 失败,不能只成功一个步骤。 一致性 :包括

    2023年04月26日
    浏览(68)
  • 系统架构设计师---事务管理、并发控制、数据库的备份与恢复

    目录 事务管理       定义       事务的四个特性(ACID)     相关SQL语句 并发控制     并发操作     封锁  数据库的备份与恢复      备份(转储)与恢复        备份分类       数据库的四类故障          DBMS 运行的基本工作单位是事务,事务是用户定义的一个数据库

    2024年02月12日
    浏览(36)
  • Spring使用@Transactional 管理事务,Java事务详解。

    B站视频:https://www.bilibili.com/video/BV1eV411u7cg 技术文档:https://d9bp4nr5ye.feishu.cn/wiki/HX50wdHFyiFoLrkfEAAcTBdinvh 简单来说事务就是一组对数据库的操作 要么都成功,要么都失败。 事务要保证可靠性,必须具备四个特性:ACID。 A:原子性:事务是一个原子操作单元,要么完全执行,要么

    2024年02月11日
    浏览(24)
  • 【cfengDB】自己实现数据库第0节 ---整体介绍及事务管理层实现

    LearnProj 本文作为数工底层的项目CfengDB开始篇章,介绍开发缘由和实现思路 cfeng之前对数据库研究不深入,之前只是能够做到基本的SQL查询和基本的慢SQL优化,之前拿到数据库系统工程师证书还是只在业务上对于DB系统使用更深入,但是cfeng基于work的理解,当作为一个优秀的产

    2024年02月16日
    浏览(32)
  • 4、hive的使用示例详解-事务表、视图、物化视图、DDL(数据库、表以及分区)管理详细操作

    1、apache-hive-3.1.2简介及部署(三种部署方式-内嵌模式、本地模式和远程模式)及验证详解 2、hive相关概念详解–架构、读写文件机制、数据存储 3、hive的使用示例详解-建表、数据类型详解、内部外部表、分区表、分桶表 4、hive的使用示例详解-事务表、视图、物化视图、DDL

    2024年02月09日
    浏览(42)
  • java Sping aop 以及Spring aop 的应用事务管理

    线程死锁概念和如何避免死锁的发生: 线程的通信 wait notify() notify():---Object类 线程的状态: NEW ---start()---就绪状态---CPU时间片---运行状态 RUNNABLE]- --sleep()--- TIMED_WAITING ---wait()---- WAITING ----sysn---Blocked---- 终止状态[T] 线程池: 常见的线程池种类: 4种和原始 在软件业,AOP为Aspect Ori

    2024年02月12日
    浏览(33)
  • Spring 事务管理方案和事务管理器及事务控制的API

    目录 一、事务管理方案 1. 修改业务层代码 2. 测试 二、事务管理器 1. 简介 2. 在配置文件中引入约束 3. 进行事务配置 三、事务控制的API 1. PlatformTransactionManager接口 2. TransactionDefinition接口 3. TransactionStatus接口 往期专栏文章相关导读  1. Maven系列专栏文章 2. Mybatis系列专栏文

    2024年02月08日
    浏览(32)
  • spring事务管理详解和实例(事务传播机制、事务隔离级别)

    目录 1 理解spring事务 2 核心接口 2.1 事务管理器 2.1.1 JDBC事务 2.1.2 Hibernate事务 2.1.3 Java持久化API事务(JPA) 2.2 基本事务属性的定义 2.2.1 传播行为 2.2.2 隔离级别 2.2.3 只读 2.2.4 事务超时 2.2.5 回滚规则 2.3 事务状态 3 编程式事务 3.1 编程式和声明式事务的区别 3.2 如何实现编程式

    2024年02月06日
    浏览(33)
  • 【MySQL系列】MySQL的事务管理的学习(一)_ 事务概念 | 事务操作方式 | 事务隔离级别

    「前言」文章内容大致是MySQL事务管理。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 事务的概念 MySQL事务是指一系列的数据库操作(一组 DML 语句),这些操作要么全部成功执行,要么全部失败回滚。事务的目的是确保数据库的一致性和完整性 事务就是要

    2024年02月09日
    浏览(28)
  • 【掌握Spring事务管理】深入理解事务传播机制的秘密

    🎉🎉🎉 点进来你就是我的人了 博主主页: 🙈🙈🙈 戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔 🤺🤺🤺 目录 1.Spring 中事务的实现方式 1.1 Spring 编程式事务 (了解) 1.2 Spring 声明式事务 ( @Transactional ) 【异常情况一】(自动回滚成功) 【异常情况二】(自动回滚失效

    2024年02月10日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包