- 只对public修饰方法才起作用
- @Transaction默认检测异常为RuntimeException及其子类 如果有其他异常需要回滚事务的需要自己手动配置,例如:@Transactional(rollbackFor = Exception.class)
- 确保异常没有被try-catch{},catch以后也不会回滚
- 检查下自己的数据库是否支持事务,如mysql的mylsam
- Springboot项目默认已经支持事务,不用配置;其他类型项目需要在xml中配置是否开启事务
- 如果在同一个类中,一个非@Transaction的方法调用有@Transaction的方法不会生效,因为代理问题
@Transaction在方法上和类上的区别
- 在类上相当于在每个public方法上加上@Transaction
- 方法上的@Transaction配置会覆盖类上的配置
属性 | 描述 |
value | 可选的限定描述符,指定使用的事务管理器 |
propagation | 可选的事务传播行为设置 |
isolation | 可选的事务隔离级别设置 |
readOnly | 读写或只读事务,默认读写 |
timeout | 事务超时时间设置 |
rollbackFor | 导致事务回滚的异常类数组 |
rollbackForClassName | 导致事务回滚的异常类名字数组 |
noRollbackFor | 不会导致事务回滚的异常类数组 |
noRollbackForClassName | 不会导致事务回滚的异常类名字数组 |
注意:事务只能控制数据库中操作的回滚,如果一个方法中不止包含数据库的操作。例如注册店铺是要保存店铺图片,我们希望如果数据库操作不成功那么图片也不要保存,就必须将保存图片的方法放在数据库操作后面。从而实现我们想要的效果。