乐趣区

关于java:为什么阿里规定需要在事务注解Transactional中指定rollbackFor

作者:Mint6

起源:http://39sd.cn/53D5D

Java 阿里巴巴标准提醒:办法【edit】须要在 Transactional 注解指定 rollbackFor 或者在办法中显示的 rollback。

异样的分类

先来看看异样的分类

error 是肯定会回滚的。

这里 Exception 是异样,他又分为运行时异样 RuntimeException 和非运行时异样

可查的异样(checked exceptions):Exception 下除了 RuntimeException 外的异样
不可查的异样(unchecked exceptions):RuntimeException 及其子类和谬误(Error)

如果不对运行时异样进行解决,那么呈现运行时异样之后,要么是线程停止,要么是主程序终止。

如果不想终止,则必须捕捉所有的运行时异样,决不让这个解决线程退出。队列外面出现异常数据了,失常的解决应该是把异样数据舍弃,而后记录日志。不应该因为异样数据而影响上面对失常数据的解决。

非运行时异样是 RuntimeException 以外的异样,类型上都属于 Exception 类及其子类。如 IOException、SQLException 等以及用户自定义的 Exception 异样。对于这种异样,JAVA 编译器强制要求咱们必须对呈现的这些异样进行 catch 并解决,否则程序就不能编译通过。所以,面对这种异样不论咱们是否违心,只能本人去写一大堆 catch 块去解决可能的异样。

@Transactional 的写法

开始主题 @Transactional 如果只这样写,

Spring 框架的事务基础架构代码将默认地 只 在抛出运行时和 unchecked exceptions 时才标识事务回滚。

也就是说,当抛出个 RuntimeException 或其子类例的实例时。(Errors 也一样 – 默认地 – 标识事务回滚。)从事务办法中抛出的 Checked exceptions 将不被标识进行事务回滚。

1 让 checked 例外也回滚:在整个办法前加上 @Transactional(rollbackFor=Exception.class)

2 让 unchecked 例外不回滚:@Transactional(notRollbackFor=RunTimeException.class)

3 不须要事务管理的 (只查问的) 办法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

留神:如果异样被 try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛 try{}catch{throw Exception}。

留神

Spring 团队的倡议是你在具体的类(或类的办法)上应用 @Transactional 注解,而不要应用在类所要实现的任何接口上。

你当然能够在接口上应用 @Transactional 注解,然而这将只能当你设置了基于接口的代理时它才失效。因为注解是不能继承的,这就意味着如果你正在应用基于类的代理时,那么事务的设置将不能被基于类的代理所辨认,而且对象也将不会被事务代理所包装(将被确认为重大的)。因而,请承受 Spring 团队的倡议并且在具体的类上应用 @Transactional 注解。

@Transactional 注解标识的办法,处理过程尽量的简略。尤其是带锁的事务办法,能不放在事务外面的最好不要放在事务外面。能够将惯例的数据库查问操作放在事务后面进行,而事务内进行增、删、改、加锁查问等操作。

最初

私信回复 材料 支付一线大厂 Java 面试题总结 + 阿里巴巴泰山手册 + 各知识点学习思维导 + 一份 300 页 pdf 文档的 Java 外围知识点总结!

这些材料的内容都是面试时面试官必问的知识点,篇章包含了很多知识点,其中包含了有基础知识、Java 汇合、JVM、多线程并发、spring 原理、微服务、Netty 与 RPC、Kafka、日记、设计模式、Java 算法、数据库、Zookeeper、分布式缓存、数据结构等等。

退出移动版