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