阶段七-Day04-Spring03

news2024/11/13 15:26:51

一、Sping声明式事务

1. 编程式事务介绍

整个事务控制的代码都需要程序员自己编写。包含:开启事务(openSession(),创建SqlSession时MyBatis底层自动创建Transaction对象)、提交事务(session.commit())、回滚事务(session.rollback()),像这种整个事务控制代码都需要程序员自己编写的事务叫做编程式事务。

2. 声明式事务介绍

但是当在MyBatis项目中做多个DML操作时,就会发现:上面的代码是固定性套路代码,很多代码是冗余代码

Spring框架发现既然都是固定性代码,就由Spring帮助封装起来。封装后对外让程序员只需进行简单的XMl配置就可以完成事务管理,不再编写事务管理代码。这就是Spring非常重要的功能之一:声明式事务。

3. 声明式事务式底层实现

声明式事务是基于AOP实现的。程序员只需要编写调用持久层代码和业务逻辑代码。把开启事务的代码放在前置通知中,把事务回滚和事务提交的代码放在了后置通知中

相当于把这些冗余的代码通过通知注入到执行sql的方法中,实现事务的控制

二、声明式事务代码演示

1.搭建基本演示环境

1.1 创建项目并配置依赖

新建Maven项目,并配置依赖。

依赖中包含了Mybatis依赖、数据库驱动依赖、Spring核心依赖、Spring整合MyBatis依赖、log4j依赖、spring-test模块依赖、junit4依赖、AOP相关依赖以外,还多了一个新的依赖spring-tx。

 <!-- 事务管理包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.3.16</version>
        </dependency>

4. 如何配置声明式事务

 <!-- 3. 配置事务管理类:Spring封装事务固定套路代码的类-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 事务管理必须连接数据库,需要注入数据源对象 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 2. Spring提供了很多事务控制方法,设定哪个方法应用具体哪种方案 -->
    <!-- 目前只是设定insert方法是一个事务单元,没有具体设定其他详细的事务配置-->
    <!-- 只有方法出现了异常触发异常通知,实现事务回滚,所以绝对不能在service里面try...catch-->
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="insert"/>
        </tx:attributes>
    </tx:advice>
    <!-- 1. 设定哪个方法需要被声明式事务管理,使用AOP完成,通过切点定义需要进行声明式事务管理的方法 -->
    <aop:config>
        <aop:pointcut id="mypoint" expression="execution(*  com.sh.service.impl.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="mypoint"></aop:advisor>
    </aop:config>

6. 注解配置声明式事务(常用)

Spring 注解配置事务时,只需要在需要有事务管理的方法上添加@Transactional注解。

必须保证配置注解的方法所在的类已经放入到Spring容器中。

配置注解扫描:

<context:component-scan base-package="com.sh.service.impl"></context:component-scan>

 配置事务管理器类:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

使声明式注解生效:

<tx:annotation-driven></tx:annotation-driven>

使用注解配置事务

重要提示:

  1. @TransactionManager 默认寻找叫做transactionManager的事务管理器。如果没有找到会报异常NoSuchBeanDefinitionException。所以,如果希望配置注解时简单点直接写@Transactional就生效,就必须在XML配置事务管理器时,id必须叫做transactionManager。

  2. 如果在XML配置事务管理器时,id不叫transactionManager,需要在@Transactional(transactionManager="XML配置时id值")。

  3. @Transactional用在类上,整个类中方法都生效。

  4. @Transactional用在方法上,该方法生效。用在方法上优先级更高。

声明式事务的属性,注解和配置文件都有,注解更多

name属性: 配置哪些方法需要事务控制,支持通配符

readonly属性 : 是否为只读事务 ,常用与查询操作 @Transaction(readonly = true)

rollback-for属性:异常类型全限定路径,表示出现什么类型的异常进行数据回滚。

no-rollback-for属性:定义出现的异常出现了不处理

四、事务传播行为(面试题)

事务传播行为:当出现service的方法调用另一个service方法时(这些方法都被声明式事务管理),这些方法如何进行事务管理。

注意:

1. 默认情况下都认为每个方法都是没有事务的(事务自动提交)。

2. 整个调用最终都是在调用者里面统一提交回滚。

3. 在声明式事务中,如果是同一个类的多个方法相互调用,属于同一个事务。

4. 如果希望测试效果,必须把方法放入到多个不同的业务类中进行测试。

@Transactional(propagation = 中设置)

REQUIRED(默认值):如果当前有事务则加入到事务中。如果当前没有事务则新增事务。

NEVER:必须在非事务状态下执行,如果当前没有事务,正常执行,如果当前有事务,报错。

NESTED:必须在事务状态下执行。如果没有事务,新建事务,如果当前有事务,创建一个嵌套事务(子事务)。

REQUIRES_NEW:必须在事务中执行,如果当前没有事务,新建事务,如果当前有事务,把当前事务 挂起, 重新建个事务。(调用者统一提交回滚)

SUPPORTS:如果当前有事务就在事务中执行,如果当前没有事务,就在非事务状态下执行。

NOT_SUPPORTED:必须在非事务下执行,如果当前没有事务,正常执行,如果当前有事务,把当前 事务挂起。

MANDATORY:必须在事务内部执行,如果当前有事务,就在事务中执行,如果没有事务,报错。(可 以配置在入口方法)

五、事务隔离级别(面试题)

多个事务同时操作数据库时,允许多个事务操作的方式就是事务隔离级别。事务隔离级别主要是通过添加锁操作实现的。事务隔离级别主要是解决高并发下脏读、幻读、不可重复读问题的。

事务隔离级别出现场景:高并发场景。

Java主要做的就是Web项目(服务端项目),每次客户端发送的都叫请求。运行多人同时请求,每个请求运行同一个方法实际上是多个事务。

脏读:

事务A没有提交事务,事务B读取到事务A未提交的数据,这个过程称为脏读。读取到的数据叫做脏数据。

不可重复读:

当事务A读取到表中一行数据时,同时另一个事务修改这行数据,事务A读取到的数据和表中真实数据不一致。

幻读:

事务A对表做查询全部操作,事务B向表中新增一条数据。事务A查询出来的数据和表中数据不一致,称为幻读。

@Transactional中设置属性isolation的值来进行配置。(select @@transaction_isolation查询数据库支持的事务隔离级别)

isolation可取值分别为:

DEFAULT:

表示用数据库的隔离级别,MySQL8默认的事务隔离级别REPEATABLE_READ。

READ_UNCOMMITTED:

读未提交(脏读,幻读,不可重复读)。

READ_COMMITTED:

读已提交(幻读,不可重复读)。

REPEATABLE_READ:

可重复读(幻读)。

MySQL采用了MVCC版本控制:

1. 不添加锁的读,快照读(读取的数据状态进行临时存储,快照读读取临时数据),解决幻读

2.加锁读,必须读取数据库中的数据,出现幻读

MySQL中锁机制:

1. 显示锁:
 1. 执行查询默认不使用锁

2. 查询时使用锁

1. 查询sql for update; 添加排他锁

2. 查询sql lock in share mode; 添加了共享锁

2.自动锁:添加,修改,删除 自动添加排它锁

SERIALIZABLE

串行读来通过牺牲性能解决脏读、不可重复度、幻读问题。

六、属性配置文件

1. 属性配置文件

现在我们在配置applicationcontext.xml的时候是直接将数据源参数在配置文件中直接配置的,就是数据库的链接参数。spring也提供了一种解耦合的配置方式,就是将数据源中的数据库链接参数单独的写在一个配置文件中。

配置文件需要直接声明在src目录下,文件名随意。键名任意,但是用户名不能使用username,可能会和系统的变量冲突。

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/account?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
user=root
password=root

applicationcontext.xml配置文件:

<!--配置参数配置文件路径-->
 <context:property-placeholder location="classpath:db.properties"/>
<!--配置数据源bean-->
<bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">
     <property name="driverClassName" value="${driver}"></property>
     <property name="url" value="${url}"></property>
     <property name="username" value="${user}"></property>
     <property name="password" value="${password}"></property>
 </bean>

七、获取属性文件中的值

@Value

作用:用来替换配置文件中的属性注入的。

使用:在属性上声明,值为${“键名”}

注意:使用此注解的注入,无需提供get/set方法。

@Component("u")
public class User {
    @Value("1")
    private Integer uid;
    @Value("${driver}")
    private String uname;
    private String pwd;
	......
}

八、Bean的生命周期(面试题)

Spring中Bean的生命周期就是指Bean从初始化到销毁的过程。Bean最简单的实现就是直接使用<bean>标签定义这个Bean。

<bean id="user" class="com.sh.pojo.User"></bean>

1. 生命周期流程图

在这种情况下会调用类的构造方法进行实例化。

  1. 通过标签的init-method和destory-method自定义初始化和销毁方法。

  2. 实现各种Aware接口,例如BeanNameAware、BeanFactoryAware、ApplicationContextAware等,可以获取bean名字信息,bean工厂信息,容器信息。

  3. 通过InitializingBean,DisposableBean实例化Bean和销毁Bean。

  4. 通过BeanFactoryPostProcessor,BeanPostProcessor进行增强。

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

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

相关文章

新型的铁塔基站“能源管家”

安科瑞 崔丽洁 引言&#xff1a;随着5G基站的迅猛发展&#xff0c;基站的能耗问题也越来越突出&#xff0c;高效可靠的基站配电系统方案&#xff0c;是提高基站能耗使用效率&#xff0c;实现基站节能降耗的重要保证&#xff0c;通过多回路仪表监测每个配电回路的用电负载情况&a…

Clickhouse学习笔记(9)—— 语法优化

ClickHouse 的 SQL 优化规则是基于 RBO(Rule Based Optimization&#xff09;实现的 官方数据集的使用 为了方便测试CK的语法优化规则&#xff0c;尝试使用官方提供的数据集&#xff1b; 需要使用的数据集是visits_v1和hints_v1&#xff1a; Anonymized Web Analytics Data …

Mysql基本知识

1.SQL分类 DDL【data definition language】 数据定义语言&#xff0c;用来维护存储数据的结构 代表指令: create, drop, alter DML【data manipulation language】 数据操纵语言&#xff0c;用来对数据进行操作 代表指令&#xff1a; insert&#xff0c;delete&#xff0c;up…

MapInfo Pro “偏移”命令

偏移对象的用途是什么&#xff1f; 将一个或多个地图对象移动特定距离和/或方向&#xff0c;并将其放置在可编辑层中。对象可以来自任何层。您可以在选择操作后聚合数据。 ​ “偏移对象”何时处于活动状态&#xff1f; 当“贴图”窗口为活动窗口时&#xff0c;该窗口具有可编…

2023数字科技生态大会-数字安全论坛 学习笔记

监管合规->价值创造的方向&#xff0c;在安全领域的发展方向-安全运营服务型 ICT->数字->数据 数字安全&#xff1a;网络安全数据安全 传统信息化以计算为核心&#xff0c;数字化以数据为核心 数字安全技术发展十大趋势&#xff1a; 一、 数字安全技术政策环境将不…

电热毯电热床上用品上架亚马逊美国站UL964测试标准要求

美国是一个对安全要求非常严格的国家&#xff0c;美国本土的所有电子产品生产企业早在很多年前就要求有相关检测。而随着亚马逊在全球商业的战略地位不断提高&#xff0c;境外的电子设备通过亚马逊不断涌入美国市场。“为保证消费者得安全&#xff0c;亚马逊始终强调带电得产品…

一文了解芯片测试项目和检测方法 -纳米软件

芯片检测是芯片设计、生产、制造成过程中的关键环节&#xff0c;检测芯片的质量、性能、功能等&#xff0c;以满足设计要求和市场需求&#xff0c;确保芯片可以长期稳定运行。芯片测试内容众多&#xff0c;检测方法多样&#xff0c;今天纳米软件将为您介绍芯片的检测项目都有哪…

【EDAS论文投稿】

背景 第一次使用这个系统投稿&#xff0c;不是很熟练甚至差点错过了投稿时间&#xff0c;所以记录一下投稿过程中出现的致命问题。 注册、登录就不用说了 登陆后选择自己的会议的symposia 添加文章信息&#xff1b;依次添加作者信息 在第三步长传文件时&#xff0c;系统提示…

Ultipa 支持OpenCypher,助力企业级应用发展

OpenCypher 是欧美图数据库厂家 Neo4j 基于其图查询语言Cypher 开发的一套开源图查询语言&#xff0c;该语言也是开发者们较为熟悉的图查询语言之一。 Ulitpa Graph&#xff08;嬴图&#xff09;于2022年6月实现的对OpenCypher 的支持&#xff0c;旨在让用户能够通过自己熟悉的…

springcloudalibaba入门详细使用教程

目录标题 一、简介二、SpringCloud Alibaba核心组件2-1、Nacos (配置中心与服务注册与发现)2-2、Sentinel (分布式流控)2-3、RocketMQ (消息队列)/RabbitMq/kafka2-4、Seata (分布式事务)2-5、Dubbo (RPC) 三、为什么大家看好 Spring Cloud Alibaba3-1、阿里巴巴强大的技术输出…

使用责任链模式实现登录风险控制

责任链模式 责任链模式是是设计模式中的一种行为型模式。该模式下&#xff0c;多个对象通过next属性进行关系关联&#xff0c;从而形成一个对象执行链表。当发起执行请求时&#xff0c;会从首个节点对象开始向后依次执行&#xff0c;如果一个对象不能处理该请求或者完成了请求…

福建科立讯通信 指挥调度管理平台RCE漏洞复现

0x01 产品简介 福建科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。该产品旨在提供高效的指挥调度和管理解决方案&#xff0c;以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能&#xff0c;可以实时监控和管理通信网络设…

一文让你了解网络刷卡器的特点和优势

网络刷卡器一款高性能的多协议电子标签读写器&#xff0c;保持高识读率的同时实现对电子标签的快速读写处理&#xff0c;广泛应用于物流追踪、个人身份识别、人员管理、智能停车场、门禁考勤、公交一卡通、餐饮、金融等多个领域。 特点和优势&#xff1a; 1&#xff09;低功耗、…

知识管理工具zotero的数据迁移工作

工作中一直使用zotero来管理一些有价值的文档&#xff0c;时间长了这个数据库的大小也是很大的&#xff0c;如果有调整电脑的需求&#xff0c;那么这个数据库就要随之迁移&#xff0c;zotero有两种数据迁移方式&#xff0c;一种是云同步&#xff0c;需要买zotero的容量&#xf…

【FastCAE源码阅读8】调用gmsh生成网格

FastCAE使用gmsh进行网格划分&#xff0c;划分的时候直接启动一个新的gmsh进程&#xff0c;个人猜测这么设计是为了规避gmsh的GPL协议风险。 进行网格划分时&#xff0c;其大体运行如下图&#xff1a; 一、Python到gmshModule模块 GUI操作到Python这步不再分析&#xff0c;比…

C++学习第三十七天----第十章--对象和类

10.2.2 C中的类 类是一种将抽象转换未用户定义类型的C工具&#xff0c;它将数据表示和操作数据的方法合成一个整洁的包。 接口&#xff1a;一个共享框架&#xff0c;供两个系统交互时使用。 1.访问控制 使用类对象的程序可以直接访问类的公有部分&#xff0c;但只能通过公有…

单片机定时器讲解和实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、计数器是什么&#xff1f;二、单片机定时器结构2.1***两个8位如何合成16位&#xff0c;16位如何分成两个8位***2.2 计数器的位数组合&#xff1f;2.3 定时功…

用python将csv表格数据做成热力图

python的开发者为处理表格和画图提供了库的支持&#xff0c;使用pandas库可以轻松完成对csv文件的读写操作&#xff0c;使用matplotlib库提供了画热力图的各种方法。实现这个功能首先需要读出csv数&#xff0c;然后设置自定义色条的各种属性如颜色&#xff0c;位置&#xff0c;…

[Android]新建项目使用AppCompatActivity后运行闪退

报错 日志&#xff1a; Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. FATAL EXCEPTION: main Process: com.example.gatestdemol, PID: 26071 java.lang.RuntimeException: Unable to start a…