Spring的事务控制

目录

基于AOP的声明事务控制

Spring事务编程概述

搭建测试环境

基于xml声明式事务控制

 详解

事务增强的AOP

平台事务管理器

Spring提供的Advice(重点介绍)

原理 (源码没有翻太明白)

基于注解声明式事务控制


基于AOP的声明事务控制

Spring事务编程概述

  • 事务是开发过程中必不可少的东西,使用JDBC开发时,我们使用connection对事务进行控制,使用MyBatis时,我们使用SqlSession对事物进行控制,缺点显而易见,当我们切换数据库访问技术时,事务控制的方法总会改变。Spring就在这些技术的基础上,提供了统一的控制事务接口。Spring的事务分为:编程式事务和声明式事务控制。
  • 事务控制方式解释
    编程式事务控制Spring提供了事务控制的类和方法,使用编程的方法对业务代码进行事务控制,事务控制代码和业务操作代码耦合在一起,开发中不使用
    声明式事务Spring将事务控制的代码封装起来,对外提供xml和注解的配置方式,通过配置的方式完成事务的控制,可以达到事务控制和业务操作代码的解耦,开发中推荐使用
  • Spring事务编程相关的类主要有以下三个

    • 类名功能
      PlatformTransactionManager平台事务管理器,抽象了不同的事务技术(如 JDBC、JTA)下的事务管理器。它定义了事务的开始、提交和回滚等操作接口,由具体实现提供相应的实现。Spring 提供了多种实现,不同持久层有不同实现方案,如 DataSourceTransactionManager、HibernateTransactionManager 和 JpaTransactionManager 等。
      TransactionDefinition事务定义,用于定义事务的隔离级别、超时时间等属性。Spring 定义了多种常量值,如 ISOLATION_DEFAULTISOLATION_READ_COMMITTEDISOLATION_REPEATABLE_READ 等隔离级别;TIMEOUT_DEFAULTTIMEOUT_NONE 等超时时间。
      TransactionStatus事务状态,包括是否新事务、是否已完成、是否回滚等状态。将该状态对象传递给事务管理器的 commit() 或 rollback() 方法可以控制事务的提交或回滚操作。
    • 虽然编程式事务控制我们不学习,但是编程式事务控制对应的类我们需要理解一下,因为我们在通过配置的方式进行声明式事务控制时也会看到这些类的影子。

搭建测试环境

  • 搭建转账的环境,dao层一个转出钱的方法,service是一个转账业务的方法,内部分别调用dao层转出钱和转入钱的方法,准备工作如下
    • 数据库准备一个账户表tb_account;
    • dao层准备一个AccountMapper,包括incrMoney和decrMoney两个方法
      • package com.example.Mapper;import org.apache.ibatis.annotations.Param;
        import org.apache.ibatis.annotations.Update;
        import org.springframework.stereotype.Repository;@Repository("accountMapper")
        public interface AccountMapper {@Update("update tb_account set money = money + #{money} where account_name=#{accountName}")public void incrMoney(@Param("accountName") String accountName, @Param("money") Integer money);@Update("update tb_account set money = money - #{money} where account_name=#{accountName}")public void decrMoney(@Param("accountName") String accountName, @Param("money") Integer money);
        }
        
    • service层(作为目标类,使用了注解的方式将其交给Spring容器管理,不需要再到xml配置文件中去配置)准备一个transferMoney方法,分别调用incrMoney和decrMoney方法
      • package com.example.Service.ServiceImpl;import com.example.Mapper.AccountMapper;
        import com.example.Service.AccountService;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Service;@Service("accountService")
        public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountMapper accountMapper;@Overridepublic void transferMoney(String outAccount, String inAccount, Integer money) {accountMapper.decrMoney(outAccount, money);System.out.println(outAccount + "转出" + money + "元");accountMapper.incrMoney(inAccount, money);System.out.println(inAccount + "转入" + money + "元");}
        }
        
    • 在applicationContext文件中进行Bean的管理配置
      • <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!--    指定Spring组件扫描范围--><context:component-scan base-package="com.example"/><!--配置数据源信息--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/db02"/><property name="username" value="root"/><property name="password" value="123456"/></bean><!--    配置SqlSessionFactoryBean,作用将SqlSessionFactoryBean存储到Spring容器中--><bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.example.Mapper"/></bean></beans>
        

        测试正常转账和异常转账

        • 正常测试代码
        • package com.example.Test;//import com.example.Config.MyBatisConfig;
          import com.example.Service.AccountService;
          import org.springframework.context.ApplicationContext;
          import org.springframework.context.annotation.AnnotationConfigApplicationContext;
          import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestAccount {public static void main(String[] args) {
          //        ApplicationContext context = new AnnotationConfigApplicationContext(MyBatisConfig.class);ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");AccountService accountService = (AccountService) context.getBean("accountService");accountService.transferMoney("tom", "lucy", 500);}
          }
          
        • 运行结果如下:

        • 错误测试,在业务层中加入错误
        •  
          package com.example.Service.ServiceImpl;import com.example.Mapper.AccountMapper;
          import com.example.Service.AccountService;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.stereotype.Service;@Service("accountService")
          public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountMapper accountMapper;@Overridepublic void transferMoney(String outAccount, String inAccount, Integer money) {accountMapper.decrMoney(outAccount, money);System.out.println(outAccount + "转出" + money + "元");int i = 1 / 0;accountMapper.incrMoney(inAccount, money);System.out.println(inAccount + "转入" + money + "元");}
          }
          
        • 同样运行上述测试代码

        • 运行结果如下(出现数据无法对应


基于xml声明式事务控制

  • 综合我们上面学到的AOP技术,很容易想到,可以使用AOP对Service的方法进行事务增强
    • 目标类:自定义的AccounServiceImpl,内部的方法是切点。不需要在xml配置文件中再次进行配置,已经使用注解方式,将其交给Spring容器管理
    • 通知类:Spring提供的,通知方法已经定义好,只需配置即可。
  • 分析
    • 通知类是Spring提供的,需要导入Spring事务相关的坐标
    • 配置目标类AccountServiceImpl
    • 使用advisor标签配置切面
  • 具体的配置文件如下
    • <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!--    指定Spring组件扫描范围--><context:component-scan base-package="com.example"/><!--配置数据源信息--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/db02"/><property name="username" value="root"/><property name="password" value="123456"/></bean><!--    配置SqlSessionFactoryBean,作用将SqlSessionFactoryBean存储到Spring容器中--><bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.example.Mapper"/></bean><!-- todo 以下是使用AOP进行事务管理部分的配置--><!--    配置平台事务管理器--><bean name="transactionManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--    配置Spring提供的通知(advice)--><tx:advice id="AccountServiceAdvice" transaction-manager="transactionManager1"><tx:attributes><tx:method name="*"/></tx:attributes></tx:advice><!--    事务增强的AOP--><aop:config><!--        配置切点表达式--><aop:pointcut id="AccountService"expression="execution(* com.example.Service.ServiceImpl.AccountServiceImpl.*(..))"/><!--        配置织入关系,通知引用Spring所提供的--><aop:advisor advice-ref="AccountServiceAdvice" pointcut-ref="AccountService"/></aop:config></beans>
      

对于事务、AOP、代理对象的产生等相关知识,可以前往我的主页进行关键字搜索,自行查阅

  •  上述配置文件在最初配置文件的基础之上,使用AOP将目标方法进行事务管理
  • 具体的做法如下
    • 首先设置切点表达式,确定目标方法后,然后将切点表达式和Spring提供的通知进行织入,而此时需要配置Spring提供的通知,在配置该通知时需要配置事务平台管理器,最后将事务平台管理器配置好之后,就完成了对于目标方法的事务管理。
    • 事务平台管理器的作用
      • 事务的创建:事务平台管理器通过获取事务配置,从而创建一个新的事务对象,用于执行目标方法。

      • 事务的提交:在目标方法正常执行结束后,事务平台管理器会将事务提交,从而将所有修改操作永久保存到数据库。

      • 事务的回滚:在目标方法执行发生异常时,事务平台管理器会自动回滚事务,将所有修改操作撤销,保持系统数据的一致性。

      • 事务的传播行为:事务平台管理器可以根据配置,将事务从一个方法传播到另一个方法,以保证不同方法之间的数据一致性。

      • 事务隔离级别:事务平台管理器可以设置事务的隔离级别,从而决定不同事务之间可见的数据范围和并发度等问题。

      • Spring 支持多种事务平台管理器,例如 DataSourceTransactionManager、HibernateTransactionManager、JpaTransactionManager 等。不同的事务平台管理器对应着不同的持久化技术和数据库访问框架,在使用时需要注意选择合适的方案。

        当我们使用 Spring 进行事务管理时,事务平台管理器就是整个事务处理流程中的核心组件。它通过管理和控制事务,保证了数据操作的原子性、一致性、隔离性和持久性等特性,从而维护了数据库的完整性和系统的稳定性。

    • 再次运行最初存在人为错误的情况下,测试代码
    • 运行结果如下
      •  
        数据一致性得到了保障,AOP进行事务管理成功

 详解
  • 基于上述配置文件中使用AOP配置事务管理的配置,来对事务管理的配置进行详解
事务增强的AOP
  • 事务增强的AOP部分在往期介绍AOP的文章中已经进行详细的阐述了,具体可以查阅Spring专栏中的AOP部分的相关文章。
平台事务管理器
  • 平台事务管理器是一个接口,实现该接口取决于当前DAO持久层使用的框架是什么,不同的框架实现不同的接口,正如上述配置中显示,我们使用的是JDBC框架

        其对应的平台事务管理器是DataSourceTransactionManager,MyBatis框架也是如此,因为MyBatis底层实现也是JDBC进行操作的。 

Spring提供的Advice(重点介绍)
  • 主要配置事务的通知(建议/advice),而对于事务的操作则通过平台事务管理器实现,所以引入上述配置的平台事务管理器。
  • 主要介绍不同方法的事务属性中的配置(重点
    • 其中method标签用于配置不同方法的事务属性
      • name属性:指定方法名称,*表示通配符 add*对应所有以add开头的方法,此处需要区分的是切点表达式中指定的方法与此处的指定的方法有什么区别?切点表达式中是过滤哪些方法要解析AOP提供的事务管理增强;事务属性信息的name是指定这写过滤后的方法哪些进行事务属性的配置。
      • isolation属性:指定事务的隔离级别,事务并存在三大问题:脏读,不可重复读,幻读/虚读。可以通过设置事务的隔离级别来保证并发问题的出现,常用的是READ_COMMITTED和PEPEATABLE_READ
        • isolation解释
          DEFAULT默认隔离级别,取决于当前数据库隔离级别,例如MySQL默认隔离级别是PEPEATABLE_READ
          READ_UNCOMMITTEDA事务可以读取B事务尚未提交的事务记录,不能解决任何并发问题,安全性最顶,性能最高
          READ_COMMITTEDA事务只能读取到其它事务已经提交的事务,不能提取到未提交的记录,可以解决脏读问题,但不可以解决不可重复读和幻读问题。
          PEPEATABLE_READA事务多次从数据库读取某条记录结果一致,可以解决不可重复读、不可以解决幻读
          SERIALIZABLE串行化,可以解决任何并发问题,安全性最高,但性能最低。
      • timeout:超时时间,访问数据库的时间做出限制,默认值为-1,即没有超时时间,单位为s
      • read-only:是否只读数据库,默认值为false,查询操作指定为只读操作
      • propagation:事务的传播行为,主要解决A方法调用B方法时,事务的传播方式的问题,例如:使用单方的事务,还是A和B都是用自己的事务。解决事务嵌套问题,即两业务方法都有事务,调用谁的事务的问题。可以参照Java Web专栏中的文章:事务管理-事务进阶-propagation属性-CSDN博客
        • 事务传播行为解释(前提都是A方法调用B方法
          REQUIRED(默认值)

          A调用B,B需要事务,如果A有事务B就加入A事务中,如果A没有事务,B就自己创建一个事务。

          REQUIRED_NEWA调用B,B需要新事物,如果A有事务就挂起,B自己创建一个新事务
          SUPPORTSA调用B,B有无事务无所谓,A有事务就加入到A事务中,A无事务B就以非事务的方式执行
          NOT_SUPPORTS

          A调用B,B就以无事务的方式进行,A如果有事务就挂起。

          NEVERA调用B,B以无事务方式执行,A如果有事务就抛出异常
          MANDATORYA调用B,B要加入A的事务中,如果A无事务就抛出异常
          NESTED

          A调用B,B创建一个新事务,A有事务就作为嵌套事务存在,A没有事务就以创建的新事物执行


原理 (源码没有翻太明白)

目前跟着翻阅源代码还不是很清楚(先学后面的)

基于注解声明式事务控制

  • 使用注方式就是对于XML配置文件中配置的替代。在老版本的Spring框架中,还需要在配置文件中设置    <tx:annotation-driven/>,从而注解生效。
  • 使用的是 @Transactional,将注解使用在类上则是将类中的所有方法都进行事务管理,注解使用在方法上,则是对该方法进行事务管理

  •  

使用全注解来对上述案例进行汇总

  • 核心配置类
    • package com.example.Config;import com.alibaba.druid.pool.DruidDataSource;
      import org.mybatis.spring.SqlSessionFactoryBean;
      import org.mybatis.spring.annotation.MapperScan;
      import org.springframework.beans.factory.annotation.Value;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.ComponentScan;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.context.annotation.PropertySource;
      import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;//注解配置类替代配置文件,实现纯注解开发
      @Configuration // 表示该类是一个核心配置类,同时将该类交给Spring容器管理(内置了@Component注解)
      @ComponentScan({"com.example"})//<context:component-scan base-package="com.example"/>
      @PropertySource({"classpath:jdbc.properties"}) // 加载外部properties文件
      @MapperScan("com.example.Mapper") //加载对应的Mapper接口类
      //@EnableTransactionManagement  Spring版本过低可能需要该注解
      public class SpringConfig {@Beanpublic DataSource dataSource(@Value("${jdbc.driver}") String driver,@Value("${jdbc.url}") String url,@Value("${jdbc.username}") String username,@Value("${jdbc.password}") String password) {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}@Beanpublic SqlSessionFactoryBean SqlSessionFactory(DataSource dataSource) {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);return sqlSessionFactoryBean;}@Beanpublic DataSourceTransactionManager transactionManager(DataSource dataSource) {DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dataSource);return dataSourceTransactionManager;}
      }
      
  • 使用全注解的方式,则获取Spring容器的方式也需要相应改变,测试类代码如下

    • package com.example.Test;//import com.example.Config.MyBatisConfig;import com.example.Config.SpringConfig;
      import com.example.Service.AccountService;
      import org.springframework.context.ApplicationContext;
      import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class TestAccount {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);AccountService accountService = (AccountService) context.getBean("accountService");accountService.transferMoney("tom", "lucy", 500);}
      }
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/99042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小视频APP源码选择指南:挑选最适合你的开发框架

在如今蓬勃发展的小视频APP行业中&#xff0c;源码的选择是打造一款成功应用的关键步骤。然而&#xff0c;面对众多开发框架的选择&#xff0c;如何挑选最适合你的小视频APP源码呢&#xff1f;作为这一领域的专家&#xff0c;我将为你提供一份详尽的指南&#xff0c;助你在源码…

Windows10打开应用总是会弹出提示窗口的解决方法

用户们在Windows10电脑中打开应用程序&#xff0c;遇到了总是会弹出提示窗口的烦人问题。这样的情况会干扰到用户的正常操作&#xff0c;给用户带来不好的操作体验&#xff0c;接下来小编给大家详细介绍关闭这个提示窗口的方法&#xff0c;让大家可以在Windows10电脑中舒心操作…

智能工厂MES系统,终端设备支持手机、PDA、工业平板、PC

一、开源项目简介 源计划智能工厂MES系统(开源版) 功能包括销售管理&#xff0c;仓库管理&#xff0c;生产管理&#xff0c;质量管理&#xff0c;设备管理&#xff0c;条码追溯&#xff0c;财务管理&#xff0c;系统集成&#xff0c;移动端APP。 二、开源协议 使用GPL-3.0开…

010:连续跌3天,同时这三天收盘价都在20日均线下,第四天上涨的概率--以京泉华为例

对于《连续跌三天&#xff0c;压第四天上涨的盈利计算》&#xff0c;我们可以继续优化这个策略&#xff0c;增加条件&#xff1a;同时三天都收盘在20日均线下。 因为我们上一篇《获取20日均线数据到excel表中》获得了20日均线数据&#xff0c;我们可以利用均线数据来编写新的脚…

基于SpringBooy的安康旅游网站的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 登录模块的实现 景点信息管理界面 酒店信息管理界面 特产管理界面 游客管理界面 景点购票订单管理界面 系统主界面 游客注册界面 景点信息详情界面 酒店详情界面 特产详情界面 三、核心代码 1、登录模块 2、文件上传模块…

c++桥接模式,中介者模式应用实现状态跳转

上图为例&#xff0c;按上述两种方式实现的模式跳转&#xff0c;如果在原先的三种模式之间再增加多一种模式&#xff0c;就会引起每个模式都会要求改变&#xff0c;并且逻辑混乱&#xff0c;因此更改模式为桥接中介者访问&#xff0c;将抽象和实现分离&#xff0c;实现之间采用…

Ultra-Fast-Lane-Detection-v2 {后处理优化}//参考

采用三次多项式拟合生成的anchor特征点&#xff0c;在给定的polyfit_draw函数中&#xff0c;degree参数代表了拟合多项式的度数。 具体来说&#xff0c;当我们使用np.polyfit函数进行数据点的多项式拟合时&#xff0c;我们需要指定一个度数。这个度数决定了多项式的复杂度。例…

JProfiler14.0(Java开发分析)

JProfiler是一款专业的Java应用程序性能分析工具&#xff0c;可帮助开发人员识别和解决Java应用程序中的性能问题。JProfiler支持Java SE、Java EE和Android平台&#xff0c;提供了多种分析选项&#xff0c;包括CPU分析、内存分析和线程分析等。 使用JProfiler&#xff0c;开发…

【设计模式】使用原型模式完成业务中“各种O”的转换

文章目录 1.原型模式概述2.浅拷贝与深拷贝2.1.浅拷贝的实现方式2.2.深拷贝的实现方式 3.结语 1.原型模式概述 原型模式是一种非常简单易懂的模型&#xff0c;在书上的定义是这样的&#xff1a; Specify the kinds of objects to create using a prototypical instance,and cre…

C语言打印菱形

一、运行结果图 二、源代码 # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int line 0;int i 0;int j 0;//获取变量值&#xff1b;scanf("%d", &line);//循环打印上半部分&#xff1b;for (i 0; i <…

Spring在业务中常见的使用方式

目录 通过IOC实现策略模式 通过AOP实现拦截 通过Event异步解耦 通过Spring管理事务 通过IOC实现策略模式 很多时候&#xff0c;我们需要对不同的场景进行不同的业务逻辑处理举个例子&#xff0c;譬如不同的场景需要不同支付方式&#xff0c;普通的逻辑是使用if-else&#x…

阿里云对象存储OSS SDK的使用

官方文档 https://help.aliyun.com/zh/oss/developer-reference/java 准备工作 windows安装好JDK&#xff0c;这里使用JDK1.8为例 windows安装好IDEA&#xff0c;这里使用IDEA2022 登录阿里云控制台&#xff0c;通过免费试用OSS或开通OSS 步骤 配置访问凭证 有临时和长期…

文化主题公园旅游景点3d全景VR交互体验加深了他们对历史文化的认知和印象

如今&#xff0c;沉浸式体验被广泛应用于文旅行业&#xff0c;尤其是在旅游演艺活动中。在许多城市&#xff0c;沉浸式旅游演艺活动已成为游客“必打卡”项目之一。因其独特体验和强互动性&#xff0c;这类演艺活动不仅吸引了外地游客&#xff0c;也吸引了本地观众。 随着信息化…

解决: 使用html2canvas和print-js打印组件时, 超出高度出现空白页

如果所示&#xff1a;当我利用html2canvas转换成图片后, 然后使用print-js打印多张图片, 第一张会出现空白页 打印组件可参考这个: Vue-使用html2canvas和print-js打印组件 解决: 因为是使用html2canvas转换成图片后才打印的, 而图片是行内块级元素, 会有间隙, 所以被挤下去了…

大数据——Spark Streaming

是什么 Spark Streaming是一个可扩展、高吞吐、具有容错性的流式计算框架。 之前我们接触的spark-core和spark-sql都是离线批处理任务&#xff0c;每天定时处理数据&#xff0c;对于数据的实时性要求不高&#xff0c;一般都是T1的。但在企业任务中存在很多的实时性的任务需求&…

Ubuntu22.04.3安装教程

虚拟机系列文章 VMware Workstation Player 17 免费下载安装教程 VMware Workstation 17 Pro 免费下载安装教程 windows server 2012安装教程 Ubuntu22.04.3安装教程 FTP服务器搭建 Ubuntu22.04.3安装教程 虚拟机系列文章前言Ubuntu22.04.3安装&#xff08;图文&#xff09; 前…

Linux系列---【查看mac地址】

查看mac地址命令 查看所有网卡命令 nmcli connection show 查看物理网卡mac地址 ifconfig 删除网卡 nmcli connection delete virbr0 禁用libvirtd.service systemctl disable libvirtd.service 启用libvirtd.service systemctl enable libvirtd.service

软件工程与计算总结(五)软件需求基础

本帖介绍软件需求涉及的诸多基本概念&#xff0c;通过对这些概念的阐述&#xff0c;剖析软件需求的来源、层次、类别、作用等重要知识~ 目录 ​编辑 一.引言 二.需求工程基础 1.简介 2.活动 3.需求获取 4.需求分析 5.需求规格说明 6.需求验证 7.需求管理 三.需求基…

【动手学深度学习】课程笔记 00-03 深度学习介绍及环境配置

目录 00-01 课程安排 02 深度学习介绍 深度学习实际应用的流程 完整的故事 03 环境配置 00-01 课程安排 1. 学习了这门课&#xff0c;你将收获什么&#xff1f; 深度学习的经典和最新模型&#xff1a;LeNet&#xff0c;ResNet&#xff0c;LSTM&#xff0c;BERT&#xff1…

JS-前端在dom中预览pdf等文件

1、将pdf等文件显示到dom元素中预览 pdf文件可以是blob、url、file类型等只要使用URL.createObjectURL(file)全部转为URL即可使用无需借助任何插件&#xff0c;只需要使用<object></object>标签即可实现 1.1、html <template><div class"home"…