Spring 事务管理
事务管理
概念:**事务是一组操作的集合,它是一个不可分割**的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败
注意:默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务
操作:事务控制主要三步操作:开启事务、提交事务/回滚事务(同时成功/一个失败)
在MySQL中手动开启事务:
1 | -- 开启事务 |
事务控制
由于事务管理在项目开发中使用的频率很高,所以Spring对其进行了封装:
- 注解:@Transactional
- 作用:将当前方法交给Spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务
- 位置:业务(Service)层的方法上、类上、接口上,推荐放在方法上(并不是所有方法、所有类都需要事务控制)
- 场景:当某个方法中存在操作多次数据库时,就可以考虑使用事务控制
- 查看Spring事务管理的底层日志:
1 | # 在配置文件中,配置日志信息,查看Spring事务管理的底层日志 |
示例:
1 |
|
rollbackFor
- rollbackFor属性用于控制出现何种异常类型,回滚事务
- 示例:
1 |
在默认情况下,Transactional只有出现了RuntimeException运行时异常,才会进行回滚
rollbackFor的参数是数组形式的,可以指定多个异常,或者直接指定所有异常(Exception)
propagation
- 事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制
1 |
|
| 属性值 | 含义 |
|---|---|
| REQUIRED | 【默认值】需要事务,有则加入,无则创建新事务 |
| REQUIRES_NEW | 需要新事务,无论有无,总是创建新事务 |
| SUPPORTS | 支持事务,有则加入,无则在无事务状态中运行 |
| NOT_SUPPORTED | 不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务 |
| MANDATORY | 必须有事务,否则抛异常 |
| NEVER | 必须没事务,否则抛异常 |
| . . . |
主要关注前两个属性,使用频率相对较多:
- REQUIRED:如果事务方法b没有指定事务传播行为(也就是采用默认属性REQUIRED),那么事务方法b就会加入到事务方法a中,且方法a和方法b被看作是一个整体事务
- REQUIRES_NEW:和REQUIRED属性的区别在于,事务方法b不会加入到事务方法a中,而是单独创建一个新的事务,也就是说此时存在两个独立的事务,事务A和事务B
注意:
propagation属性添加到**被调用事务方法**的@Transactional注解中
四大特性(ACID)
- 原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
- 隔离性(Isolution):数据库系统提供的隔离机制,保证事务在不受外部并发影响的独立环境下运行
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是**永久**的
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Norlcyan's Blog!
