我是靠谱客的博主 敏感可乐,最近开发中收集的这篇文章主要介绍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

最后

以上就是敏感可乐为你收集整理的Spring Transactional 属性详解的全部内容,希望文章能够帮你解决Spring Transactional 属性详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部