1.事务:
事务是数据库操作的基本单元,逻辑上的一组操作,要么一起成功,要么一起失败
2.事务四个特性:
原子性
一致性
隔离性
持久性
Spring事务:
声明式事务:
(1) 基于xml配置文档
(2) 基于注解配置(重点)
@EnableTransactionManagement 配置类 开启事务注解
@Transactional 表示类或者某个方法使用事务
Spring事务管理API:
提供一个接口 代表事务管理器PlatformTransactionManager接口
这个接口针对不同的框架提供了不同的实现类
声明式事务操作:
(1) 配置类 开启事务注解 @EnableTransactionManagement
(2) 配置事务
(3) 在Service类中方法或类上添加事务注解 @Transactional
@Transactional属性:
(1)propagation:事务传播行为)propagation:事务传播行为
多事务方法直接调用,这个过程中事务如何进行管理的
事务方法:对数据库表数据进行更新的操作
REQUIRED(0),:如果当前方法有事务,就是这个事务中运行,否则开启一个新的事务
SUPPORTS(1),
MANDATORY(2),
REQUIRES_NEW(3):当前方法必须启动新事务,并在自己事务内运行,如果有事务
正在运行,当前事务将被挂起
NOT_SUPPORTED(4),
NEVER(5),
NESTED(6);
(2):isolation:事务隔离级别
事务有特性是隔离性,多个事务操作之间不会产生影响,不考虑隔离性就会有很多问题
一般有三种问题: 脏读 不可重复读 虚(幻)读
脏读:一个未提交事务读取到另一个未提交事务中的数据
700
窗口1: 张三这条数据的余额修改为100 事务A
窗口2: 将张三的余额修改为5000 事务B
回滚
不可重复读: 一个未提交事务读取到另一个提交事务修改的数据
虚读:一个未提交事务读取到另一个事务添加的数据
通过设置事务隔离级别,可以解决此问题
如何查看Mysql默认隔离级别: select @@tx_isolation
(3) timeout:超时时间
事务需要在一定时间内进行提交,如果不提交进行回滚
默认值-1.设置时间秒为单位
(4)readOnly:是否只读
读:查询操作, 写:添加 删除 修改操作
readOnly默认是false.表示可以进行增删改查操作
readOnly设置为true, 只能查询
(5)rollbackFor:回滚
设置哪些异常进行事务回滚
(6)noRollbackFor :不回滚
@Transactional(propagation = Propagation.REQUIRED,
isolation = Isolation.READ_COMMITTED, timeout = 5,
readOnly = false, rollbackFor = {NullPointerException.class})