本文主要是介绍@Transactional注解分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
事务具备ACID特性,即原子性、一致性、隔离性和持久性。
@Transactional注解是用来指定接口、类或方法必须拥有事务语义的元数据。
@Transactional注解就代表支持事务管理,如果这个注解在类上,那么表示该注解对于所有该类中的public方法都生效;如果注解出现在方法上,则代表该注解仅对该方法有效,会覆盖先前从类层次继承下来的注解。
一般情况下不要将这个注解加到接口和抽象类上,因为注解是不能被继承的。
@Transactional注解如果被你在protected、private、或者package-visible的方法上使用
@Transactional注解,它不会报错,但是这个被注解的方法将不会展示已配置的事务设置。
@Transactional注解不足以开启事务行为,它仅仅是一种元数据,能够被可以识别@Transactional注解
和配置适当的具有事务行为的beans所使用。
当在接口上使用@Transactional注解时,只有当你设置了基于接口的代理才能生效。因为
注解不能继承,意思就是如果你正在使用基于类的代理时,事务的设置将不能被基于类的代理所识别,
而且对象也将不会被事务代理所包装。因此Spring团队也建议并且在具体的类上用@Transactional注解。
1.
2.
3.
4.
5.
6.
7.
8.
5、6、7、8与回滚有关,
一般不推荐使用rollbackForClassName和noRollbackForClassName两个参数,
因为使用字符串的缺点有:如果不是用类的完整路径,就可能导致回滚设置对位于不同包中的同名类都生效;且如果类名写错,也无法得到IDE的动态提示。
如果不配置任何与回滚有关的参数,不代表事务不会进行回滚,如果没有配置这四个选项,那么DefaultTransactionAttrib
| | 描述 |
传播性 | | 可选的传播性设置 |
| 枚举型:Isolation | 可选的隔离性级别(默认值:ISOLATION_DEFAULT) |
只读性 | 布尔型 | 读写型事务vs.只读型事务 |
超时 | int型(以秒为单位) | 事务超时 |
回滚异常类(rollbackFor) | 一组Class类的实例,必须 是Throwable的子类 | 一组异常类,遇到时必须进行回滚。默认情况下checked exceptions不进行回滚,仅unckecked exceptions(即RuntimeException的子类)才进行事务回滚。 |
回滚异常类名(rollbackForClassname) | 是Throwable的子类 | 一组异常类名,遇到时必须进行回滚 |
不回滚异常来(noRollbackFor) | 是Throwable的子类 | 一组异常类,遇到时必须不回滚 |
不会滚异常类名(noRollbackForClassname) | 一组Class类的实例,必须 是Throwable的子类 | 一组异常类,遇到时必须不回滚 |
默认遇到throw new RuntimeException("...");会回滚
需要捕获的throw new Exception("...");不会回滚
RuntimeException运行期例外,默认回滚
Exception 非运行期例外,不回滚
例如:
// 指定回滚
@Transactional(rollbackFor=Exception.class)
//指定不回滚
@Transactional(noRollbackFor=Exception.class)
// 如果有事务,那么加入事务,没有的话新建一个(不写的情况下)
@Transactional(propagation=Propagation.REQUIRED)
// 容器不为这个方法开启事务
@Transactional(propagation=Propagation.NOT_SUPPORTED)
// 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
// 必须在一个已有的事务中执行,否则抛出异常,不能自动创建。
@Transactional(propagation=Propagation.MANDATORY)
// 必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.NEVER)
// 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
@Transactional(propagation=Propagation.SUPPORTS)
// readOnly=true只读,不能更新,删除
@Transactional (propagation = Propagation.REQUIRED,readOnly=true)
// 设置超时时间
@Transactional (propagation = Propagation.REQUIRED,timeout=30)
// 设置数据库隔离级别
@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT
这篇关于@Transactional注解分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!