首页 > 其他分享 >【Spring5学习笔记(4)】事务管理:

【Spring5学习笔记(4)】事务管理:

时间:2022-08-20 16:00:16浏览次数:75  
标签:事务管理 事务 笔记 添加 dataSource 操作 运行 Spring5

事务
1、什么是事务
(1)事务是数据库操作的最基本单元,是逻辑上的一组操作,要么都成功,如果有一个失败则所有操作都失败
(2)经典场景:银行转账
2、事务的四个特性(ACID)
(1)原子性:一组逻辑操作不可分割
(2)一致性:数据操作前后总数一致
(3)隔离性:多事务操作时互相不产生影响
(4)持久性:提交之后表中数据永久改变

事务操作(搭建事务操作环境)
1、创建数据库表,添加记录
2、创建service、创建dao,完成对象的创建和注入
(1)service注入dao,在dao注入jdbcTemplate,在jdbcTemplate注入DataSource
(2)@Service
public class UserService {
@Autowired
private UserDao userDao;
}
(3)@Repository
public class UserDaoImpl implements UserDao{
@Autowired
private JdbcTemplate jdbcTemplate;
}
3、在Dao创建两个方法,一个是多钱一个是少钱,在Service创建方法(转账的方法)
4、代码如果正常执行则没有问题,如果在转账过程中出现异常等
(1)所以需要引入事务来解决
(2)事务操作过程
第一步 开启事务
第二步 进行业务操作
第三步 没有发生异常则提交事务
第四步 出现异常事务回滚

事务操作(Spring事务管理介绍)
1、事务添加到javaee三层结构里面的service层

2、在spring进行事务管理操作
有两种方式:编程式事务管理和声明式事务管理(使用)

3、声明式事务管理
(1)基于注解方式(使用)
(2)基于xml配置文件方式

4、在Spring进行声明式事务管理,底层使用aop

5、spring事务管理api
提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
PlatformTransactionManager

事务操作(注解声明式事务操作)
1、在spring配置文件中配置事务管理器
创建事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
注入数据源
<property name="dataSource" ref="dataSource"></property>
</bean>

2、在spring配置文件,开启事务注解
(1)在spring配置空间引入名称空间tx
(2)开启事务注解
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

3、在service类上面(获取service类里面方法上面)添加事务注解
(1)@Transacitonal,这个注解添加到类上面,也可以添加到方法上面
(2)如果把这个注解添加到类上面,这个类里面所有的方法都添加事务
(3)如果把这个注解添加方法上面,则只为这个方法添加

事务操作(声明式事务管理参数配置)
1、propagation:事务的传播行为
当一个事务方法被另一个事务方法调用的时候,这个事务方法如何进行
事务的传播行为可以由传播属性指定,spring定义了7种类传播行为
REQUIRED 如果有事务在运行,当前方法就在这个事务内运行,否者,就启动一个新的事务,并在自己的事务中运行
REQUIRED_NEW 在当前的方法必须启动新事务,并在他自己的事务内运行,如果有事务正在运行,则应该将它挂起
SUPPORTS 如果有事务在运行,当前的方法就在这个事务内运行,否则他可以不运行在事务中
NOT_SUPPORTED 当前的方法不应该运行在事务中,如果有运行的事务,将它挂起
MANDATORY 当前的方法必须运行在事物内部,如果没有正在运行的事务,就抛出异常
NEVER 当前的方法不应该运行在事务中,如果有运行的事务,就抛出异常
NESTED 如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在她自己的事务内运行
2、ioslation:事务隔离级别
(1)事务有特性称为隔离性,多事务操作之间不会产生影响,不考虑隔离性产生很多问题
(2)不考虑隔离性则存在三个问题:脏读、不可重复读、虚(幻)读
(3)脏读:一个未提交事务读取到另一个未提交事务的数据
(4)不可重复读:一个未提交事务读取到另一个提交事务修改数据
(5)幻读:一个未提交事务读取到另一提交事务添加数据
(6)通过设置事务隔离性,解决读问题

3、timeout:超时时间
(1)事务需要在一定时间内进行提交,如果不提交则进行回滚
(2)默认值是-1,设定时间以秒为单位计算

4、readOnly:是否只读
(1)读:查询操作,写:添加修改删除操作
(2)readOnly默认设置为false,表示可以查询,可以添加修改删除操作
(3)设置为true后,只能查询

5、rollbackFor:回滚
(1)设置出现哪些异常进行事务回滚

6、norollbackFor:不回滚
(1)设置出现哪些异常不进行事务回滚

事务操作(XML声明式事务管理)
1、在spring配置文件中进行配置
第一步 配置事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
第二步 配置通知
<tx:advice id="txadvice">
<tx:attributes>
<tx:method name="account*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
第三步 配置切入点和切面
<aop:config>
<aop:pointcut id="pt" expression="execution(* com.atguigu.spring5.service.UserService.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txadvice" pointcut-ref="pt"></aop:advisor>
</aop:config>

事务操作(完全注解声明式事务管理)
1、创建配置类,使用配置类代替配置文件
@Configuration
@ComponentScan(basePackages = "com.atguigu.spring5.service")
@EnableTransactionManagement //开启事务
public class txConfig {
//创建数据库连接池
@Bean
public DruidDataSource druidDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.alibaba.druid.pool.DruidDataSource");
dataSource.setUrl("jdbc:mysql://localhost:13306/user_db");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}

//创建jdbc连接对象
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource){
//到ioc容器中根据类型找到dataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//注入dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}

//创建事务管理器
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}

标签:事务管理,事务,笔记,添加,dataSource,操作,运行,Spring5
From: https://www.cnblogs.com/ricc/p/16607908.html

相关文章

  • P5677 [GZOI2017]配对统计做题笔记
    一道花了两天的题目,主要是因为死活找不出bug。从树状数组题单里翻出来的,看了第一篇题解。主要思路是把输入的点从小到大排序,统计“好的配对”的数量,统计方法为若当前数和......
  • 《线性代数的本质》笔记
    零、引言内容出自该链接一、向量1.1什么是向量向量是空间中的箭头,决定一个向量的是它的长度和它所指的方向,可以在空间自由落脚向量是有序的数字列表(此时二维向量代......
  • 基于Go语言的xmind读写库,我主要用来把有道云笔记思维导图转为xmind
    项目地址xmind基于go语言的xmind接口使用方法参考:example本库主要加载xmind文件为json结构,保存文件时也用的json结构而不是xml结构本库只做了最基本的主题添加功能......
  • Kubernetes学习笔记(十三):Daemon Sets
    DaemonSets确保pod的一个副本始终存在于集群的所有节点中,常用于MonitoringSolution、LogsViewer、Kube-porxy、Weave-net(networking)。daemon-set-definition.yamlkind......
  • Unity3D学习笔记12——渲染纹理
    目录1.概述2.详论3.问题1.概述在文章《Unity3D学习笔记11——后处理》中论述了后处理是帧缓存(Framebuffer)技术实现之一;而另外一个帧缓存技术实现就是渲染纹理了。通......
  • FreeSql笔记记录
    FreeSql的系列操作:freesql的操作有点类似于linq中的操作,不过freesql的操作是对数据库,但是linq的操作是对集合进行操作查看官方文档:https://freesql.net/guide/ 首先要......
  • 树形dp例题 + 学习笔记(入门版)
    树形dp,即在树上进行dp。需要对树这一数据结构有清晰的了解。其中重点在于树的遍历、子树相关问题。难点常常在于状态方程的书写。例题一、没有上司的舞会题意树上每......
  • 操作系统学习笔记4 | CPU管理 && 多进程图像
    操作系统的核心功能就是管理计算机硬件,而CPU就是计算机中最核心的硬件。而通过学习笔记3的简史回顾,操作系统通过多进程图像实现对CPU的管理。所以多进程图像是操作系统的核......
  • 德飞莱 C51 学习笔记
     《电子元件基础教程》:数字集成电路从结构上分为:TTL型和CMOS型  《跟我学数字电子技术》:数字电路分为 组合逻辑电路  和 时序逻辑电路 ......
  • NO.4 计算机组成-笔记
    第一章:计算机系统概述1、什么是计算机系统 1、计算机系统=硬件+软件(计算机性能的好坏取决于“软”“硬”件功能的总和) 2、软件分为: ......