概述
导语
@Transactional大家都知道他是Spring 的本地事务,但是对于他你了解多少?在项目中你是怎么应用的呢?
@Transactional 注解的属性介绍
首先开看看源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
@AliasFor("transactionManager")
String value() default "";
@AliasFor("value")
String transactionManager() default "";
Propagation propagation() default Propagation.REQUIRED;
Isolation isolation() default Isolation.DEFAULT;
int timeout() default -1;
boolean readOnly() default false;
Class<? extends Throwable>[] rollbackFor() default {};
String[] rollbackForClassName() default {};
Class<? extends Throwable>[] noRollbackFor() default {};
String[] noRollbackForClassName() default {};
}
-
value 和 transactionManager 属性
它们两个是一样的意思。当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器。
在默认的代理模式下,只有目标方法由外部调用,才能被 Spring 的事务拦截器拦截。在同一个类中的两个方法直接调用,是不会被 Spring 的事务拦截器拦截 -
propagation 属性
事务的传播行为,默认值为 Propagation.REQUIRED
可选的值有:Propagation.REQUIRED
如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。Propagation.SUPPORTS
如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。Propagation.MANDATORY
如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。Propagation.REQUIRES_NEW
重新创建一个新的事务,如果当前存在事务,暂停当前的事务。Propagation.NOT_SUPPORTED
以非事务的方式运行,如果当前存在事务,暂停当前的事务。Propagation.NEVER
以非事务的方式运行,如果当前存在事务,则抛出异常。Propagation.NESTED
和 Propagation.REQUIRED 效果一样。 -
isolation 属性
事务的隔离级别,默认值为 Isolation.DEFAULT。可选的值有:
Isolation.DEFAULT
使用底层数据库默认的隔离级别。
Isolation.READ_UNCOMMITTED
读未提交
Isolation.READ_COMMITTED
提交读
Isolation.REPEATABLE_READ
可重复读
Isolation.SERIALIZABLE
可序列化 -
timeout 属性
事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。 -
readOnly 属性
指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。 -
rollbackFor 属性
用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。 -
noRollbackFor 属性
抛出指定的异常类型,不回滚事务,也可以指定多个异常类型。
使用方式的总结
- @Transactional注解 不能作用在private 方法上
- 带有事务的方法,调用本列不带有事务的方式,会将本类不带有事务的方法纳入到事务内,
这是调用的方法,可以是私有方法,即走的是最外层方法的事务 - A类 无事务的方法,调用 B类有事务的方法时, B类异常可以进行事务回滚,但是A类无法回滚
- A类有事务的方法,调用B类无事务的方法,当B类发生异常,可以正常进行事务回滚
- 设置事务回滚的两种方式
5.1 进行 throw new Exception
5.2 可以在需要设置手动回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
这里只是个人的总计,有不足之处,还请大家多多指出!
今天的分享就到这里,希望对大家有所帮助
关注 Java有货领取更多资料
联系小编。微信:372787553,带您进群互相学习
左侧小编微信,右侧获取免费资料
技术博客:https://blog.csdn.net/weixin_38937840
免费书籍:https://github.com/Dylan-haiji/Programmer-Learning-materials
SpringCloud学习代码: https://github.com/Dylan-haiji/javayh-cloud
Redis、Mongo、Rabbitmq、Kafka学习代码: https://github.com/Dylan-haiji/javayh-middleware
AlibabaCloud学习代码:https://github.com/Dylan-haiji/javayh-cloud-nacos
SpringBoot+SpringSecurity实现自定义登录学习代码:https://github.com/Dylan-haiji/javayh-distribution
最后
以上就是敏感可乐为你收集整理的Spring Transactional 属性详解的全部内容,希望文章能够帮你解决Spring Transactional 属性详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复