1. 事务简介
事务:是数据库操作的最基本单元,逻辑上一组操作,要么都成功,如果有一个失败,所有操作都失败。
事务的四个特性(ACID):
- 原子性:要么都成功,要么都失败
- 一致性:操作之前和操作之后,总量不变
- 隔离性:多事务操作时,互相不会影响
- 持久性:事务提交后保持不变。
2. 搭建事务操作场景
2.1 事务操作(Spring事务管理介绍)
- 事务添加到JavaEE三层结构中的Service层(业务逻辑层)
- 在Spring 进行事务管理操作有两种方式:
- 编程式事务管理:通过代码控制
- 声明式事务管理:通过配置方式(Spring 一般用这种)
- Spring的声明式事务管理有两种实现方式:
- 基于注解方式:一般常用这种方式
- 基于xml配置文件方式
- 在Spring进行声明式事务管理,底层使用AOP原理
- Sping 事务管理API
- 提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类。
2.2 事务操作(注解声明式事务管理)
- 在Spring 的配置文件中配置事务管理器
- 在Spring配置文件中开启事务注解(需要引入名称空间tx)
- 在service类上面(或者service类里面方法上面)添加事务注解@Transactional
- 如果事务注解到类上面,那么类里面的所有方法都被事务管理;
- 如果事务注解添加到类的方法上,那么被注解的方法才被事务管理。
示例如下:
3.2 事务操作(声明式事务管理参数设置)
查看@Transactional 注解中的参数如下:
参数说明:
- propagation: 事务的传播行为,当一个事务被另一个事务方法调用时候,这个事务方法如何进行处理。
REQUIRED 解释如下:
REQUIRED 解释如下(如果方法A调用完方法B后出现异常,那么方法B正常执行完成后正常提交事务,即是内层事务正常提交,外层事务出现异常回滚):
SUPPORTS 解释如下(如果方法B单独被调用,方法B可以不参与事务管理,如果方法A调用方法B,那么方法B会被事务A管理):
- ioslation: 事务隔离级别
- 事务有特性成为隔离性,多事务操作之间不会产生影响。不考虑隔离性会产生很多问题。
- 不考虑隔离性会产生三个读问题:
(1)脏读:一个未提交的事务读取到另一个未提交事务的数据 (是一个致命问题) (如果另一个事务后面回滚了,即读到了错误的数据。)
(2)不可重复读:一个未提交的事务读取到另一个事务修改的数据 (是一个现象)(第一次读到未修改前的数据,第二次读到修改后的数据,两次读取的数据不同,也即是不可重复读)
(3)虚读(幻读):一个未提交的事务读取到另一个提交事务添加的数据
- 通过设置事务的隔离级别可以避免上面的读问题,具体的隔离级别如下:
- timeout: 超时时间
- 事务需要一定时间内进行提交,如果不提交进行回滚,默认值是“-1”,表示永不超时,设置时间以秒单位进行计算。
- readOnly: 是否只读
- 读:查询操作;写:添加修改删除操作。
- readOnly 默认值 false,表示可以查询,也可以添加修改删除操作。设置成true之后只能查询。
- rollbackFor: 回滚
- 设置出现哪些异常进行事务回滚
- noRollbackFor:不回滚
- 设置出现哪些异常不进行事务回滚
事务参数设置示例:
3.4 事务操作(XML声明式事务管理)
在Spring 的配置文件中配置如下三步:
第一步:配置事务管理器
第二步:配置通知
第三步:配置切入点和切面
例子:
同上面的例子,主要区别如下:
3.5 事务操作(完全注解开发)
- 用配置类代替xml文件,不再需要用到xml配置文件,只用注解
例子:
同上例子,主要区别如下: