Spring – 事务
1. Spring 事务实现方式有哪些
- 声明式事务:声明式事务有两种实现方式,基于 xml 配置文件的方式和注解方式
- 编码方式:提供编码的形式管理和维护事务
2. 说一下 Spring 的事务隔离
Spring 有五大隔离级别,默认值为 使用数据库的设置,其他四个隔离级别和数据库一样
- 读未提交:最低的隔离级别,事务提交前,就可以被其他事务读取到
- 读已提交:一个事务提交后才能被其他事务读取到
- 可重复读:保证多次读取同一个数据是,其值都和事务开始时候是一致的(防止不可重复读),Mysql 的默认级别
- 序列化:代价最高最可靠的隔离级别,该隔离级别可以防止脏读,幻读,不可重复读
脏读: 表示一个事务能够读取到另一个事务还未有提交的数据
不可重复读: 在一个事务内,多次读取同一个数据不一样
幻读: 统一个书屋内,多次查询的结果不能一样(记录的数据不一样)
3. 事务传播行为
事务行为 | 说明 |
---|---|
PROPAGATION_REQUIRED | 支持当前事务,假设当前没有事务。就新建一个事务 |
PROPAGATION_SUPPORTS | 支持当前事务,假设当前没有事务,就以非事务方式运行 |
PROPAGATION_MANDATORY | 支持当前事务,假设当前没有事务,就抛出异常 |
PROPAGATION_REQUIRES_NEW | 新建事务,假设当前存在事务。把当前事务挂起 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式运行操作。假设当前存在事务,就把当前事务挂起 |
PROPAGATION_NEVER | 以非事务方式运行,假设当前存在事务,则抛出异常 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作 |
4. 事务注解的常用参数
参数名称 | 功能描述 |
---|---|
readOnly | 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false |
rollbackFor | 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚 |
rollbackForClassName | 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚 |
noRollbackFor | 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚 |
noRollbackForClassName | 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚 |
propagation | 该属性用于设置事务的传播行为 |
solation | 该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置 |
timeout | 该属性用于设置事务的超时秒数,默认值为-1表示永不超时 |