Spring中使用事务管理(声明式管理事务基于注解)

事务操作(事务概念)

1、什么事务
(1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操
作都失败
(2)典型场景:银行转账

  • lucy 转账 100 元 给 mary
  • lucy 少 100,mary 多 100
    事务四个特性(ACID)
原子性 表示不可分割,要么都成功,要么都失败
一致性 表示操作之前和操作之后,总量是不变的
隔离性 多事务操作之前不会产生影响
持久性 提交到表单中

事务操作(搭建事务操作环境)

模拟业务
image

1、创建数据库表,添加记录
image
2、创建 service,搭建 dao,完成对象创建和注入关系
(1)service 注入 dao,在 dao 注入 JdbcTemplate,在 JdbcTemplate 注入 DataSource
image

image

3、在 dao 创建两个方法:多钱和少钱的方法,在 service 创建方法(转账的方法)
image

image
4、上面代码,如果正常执行没有问题的,但是如果代码执行过程中出现异常,有问题
如果将注释 int i =10/0 解除,那么会报错,产生的现象就是 lucy 向mary转了100元,但lucy转账成功了,而mary的账户却没有收到。 为了解决上诉的问题。引入了事务进行解决
(2)事务操作过程
image

事务操作(Spring 事务管理介绍)

1、事务添加到 JavaEE 三层结构里面 Service 层(业务逻辑层)
2、在 Spring 进行事务管理操作
(1)有两种方式:编程式事务管理声明式事务管理(使用)
3、声明式事务管理
(1)基于注解方式(使用)
(2)基于 xml 配置文件方式
4、在 Spring 进行声明式事务管理,底层使用 AOP 原理
5、Spring 事务管理 API
(1)提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类这个接口就是
PlatformTransactionManager

image

对于上面的实现类,我们采用的是Druid,所以使用DataSourceTransactionManager。如果是mybatis也是使用这个实现类。

事务操作(注解声明式事务管理)

1、在 spring 配置文件配置事务管理器

image

2、在 spring 配置文件,开启事务注解
(1)在 spring 配置文件引入名称空间 tx
image

(2)开启事务注解
image

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

事务操作(声明式事务管理参数配置)

1、在 service 类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数
image
在Transactional注解中配置参数的说明

  • propagation:事务传播行为 即表现为,当有事务的方法调用没有执行事务的方法,具体应该如何去处理。
  • isolation: 事务隔离级别
  • timeout:超时时间,事务需要在一定的时间内进行提交,如果不提交进行回滚 默认值是-1 (不超时) 设置时间以秒为单位
  • readOnly:是否只读 默认值是false,如果是true 则表示只能查询,不能修改添加删除。
  • rollbackFor:回滚,设置出现哪些异常进行事务回滚
  • noRollbackFor:不回滚,设置出现哪些异常不进行事务回滚

** 2、propagation:事务传播行为**
(1)多事务方法直接进行调用,这个过程中事务 是如何进行管理的
image

image

通常情况下:设置为REQUIRED即可
image

3、ioslation:事务隔离级别
(1)事务有特性成为隔离性,多事务操作之间不会产生影响。不考虑隔离性产生很多问题
(2)有三个读问题:脏读、不可重复读、虚(幻)读
(3)脏读:一个未提交事务读取到另一个未提交事务的数据
(4)不可重复读:一个未提交事务读取到另一提交事务修改数据
image
(5)虚读:一个未提交事务读取到另一提交事务添加数据
(6)解决:通过设置事务隔离级别,解决读问题

脏读 不可重复读 幻读
READ UNCOMMITTED(读未提交)
READ COMMITTED (读已提交)
REPEATABLE READ (可重复读)
SERIALIZABLE(串行化)
image
4、timeout:超时时间
(1)事务需要在一定时间内进行提交,如果不提交进行回滚
(2)默认值是 -1 ,设置时间以秒单位进行计算
5、readOnly:是否只读
(1)读:查询操作,写:添加修改删除操作
(2)readOnly 默认值 false,表示可以查询,可以添加修改删除操作
(3)设置 readOnly 值是 true,设置成 true 之后,只能查询
6、rollbackFor:回滚
(1)设置出现哪些异常进行事务回滚
7、noRollbackFor:不回滚
(1)设置出现哪些异常不进行事务回滚
posted @   自学Java笔记本  阅读(394)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示