Spring Transactional 属性详解

导语

@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 属性
    抛出指定的异常类型,不回滚事务,也可以指定多个异常类型。

使用方式的总结

  1. @Transactional注解 不能作用在private 方法上
  2. 带有事务的方法,调用本列不带有事务的方式,会将本类不带有事务的方法纳入到事务内,
    这是调用的方法,可以是私有方法,即走的是最外层方法的事务
  3. A类 无事务的方法,调用 B类有事务的方法时, B类异常可以进行事务回滚,但是A类无法回滚
  4. A类有事务的方法,调用B类无事务的方法,当B类发生异常,可以正常进行事务回滚
  5. 设置事务回滚的两种方式
    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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小杨同学~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值