精华内容
下载资源
问答
  • @Transactional 事务实现机制 在应用系统调用声明了@Transactional的目标方法时,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,根据@Transactional的属性配置信息,这个代理对象决定该声明@...

    @Transactional 事务实现机制

    在应用系统调用声明了 @Transactional 的目标方法时,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,根据 @Transactional 的属性配置信息,这个代理对象决定该声明 @Transactional 的目标方法是否由拦截器 TransactionInterceptor 来使用拦截,在 TransactionInterceptor 拦截时,会在目标方法开始执行之前创建并加入事务,并执行目标方法的逻辑, 最后根据执行情况是否出现异常,利用抽象事务管理器 AbstractPlatformTransactionManager 操作数据源 DataSource 提交或回滚事务。

     

    场景一:同一个service中,父方法调用了子方法都使用了@Transactional方法,则父方法发生异常时会整体回滚:

    官方解释如下:

    In proxy mode (which is the default), only external method calls coming in through the proxy are intercepted. This means that self-invocation, in effect, a method within the target object calling another method of the target object, will not lead to an actual transaction at runtime even if the invoked method is marked with @Transactional.

    大概意思:在默认的代理模式下,只有目标方法由外部调用,才能被 Spring 的事务拦截器拦截。在同一个类中的两个方法直接调用,是不会被 Spring 的事务拦截器拦截,就像上面的 save 方法直接调用了同一个类中的 method1方法,method1 方法不会被 Spring 的事务拦截器拦截。

     

    场景二:一个父方法中包含了多个子方法,如发生异常无需回滚异常前执行结果的情况,则需要将子方法写入一个新的service,并将子方法@Transactional 的 propagation 属性设置为 Propagation.REQUIRES_NEW。

    这样父方法的执行过程变更为:

    首先创建了 父方法 的事务,执行到子方法,暂停了 save 方法的事务,重新创建了 子方法 的事务,接着 子方法 的事务提交,之后发生异常, 父方法 的事务回滚。

     

    原文链接:https://blog.csdn.net/nextyu/article/details/78669997 

    本文根据博主个人需要整理保留个人理解部分。

     

     

    展开全文
  • 一、继承自父类,父类不标为只读则可写 // 父类此处未加注解,则按默认可读写 public class BaseMngService { // 父类 public int update(User entity) { // 此处执行dao.update ...

    一、继承自父类,父类不标为只读则可写

    // 父类此处未加注解,则按默认可读写
    public class BaseMngService { // 父类
        public int update(User entity) {
            // 此处执行dao.update
        }
    }
    
    @Service
    @Transactional(readOnly = true)
    public class UserService extends BaseMngService { // 子类
        @Override
        public int update(User entity) {
            return super.update(entity);
        }
    }

    二、继承自父类,父类标为只读,则是只读

    public class BaseMngService { // 父类
        @Transactional(readOnly = false) // 标为只读
        public int update(User entity) {
            // 此处执行dao.update
        }
    }
    
    @Service
    @Transactional(readOnly = true)
    public class UserService extends BaseMngService { // 子类
        @Override
        public int update(User entity) {
            return super.update(entity);
        }
    }

    二、子类可以覆盖父类的注解

    public class BaseMngService { // 父类
        @Transactional(readOnly = false) // 标为只读
        public int update(User entity) {
            // 此处执行dao.update
        }
    }
    
    @Service
    @Transactional(readOnly = true)
    public class UserService extends BaseMngService { // 子类
        @Override
        @Transactional(readOnly = true) // 标为只读
        public int update(User entity) {
            return super.update(entity);
        }
    }

    这个时候,虽然父类的update方法是注解是可写的,但是因为子类的注解是只读的,所以只在调用子类的update方法时,也是只读的。

    展开全文
  • @Transactional注解作用

    千次阅读 2020-08-21 13:13:09
    @Transactional是spring中常用的注解之一,通常情况下我们在需要对一个service方法添加事务时,加上这个注解,如果发生unchecked exception,就会发生rollback MyBatis自动参与到spring事务管理中,无需额外配置,...

    一、介绍

    @Transactional是spring中常用的注解之一,通常情况下我们在需要对一个service方法添加事务时,加上这个注解,如果发生unchecked exception,就会发生rollback

    MyBatis自动参与到spring事务管理中,无需额外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的数据源与DataSourceTransactionManager引用的数据源一致即可,否则事务管理会不起作用。

    二、@Transactional 注解的属性信息

    @Transactional**属性

    属性类型描述
    valueString可选的限定描述符,指定使用的事务管理器
    propagationenum: Propagation可选的事务传播行为设置
    isolationenum: Isolation可选的事务隔离级别设置
    readOnlyboolean读写或只读事务,默认读写
    timeoutint (in seconds granularity)事务超时时间设置
    rollbackForClass对象数组,必须继承自Throwable导致事务回滚的异常类数组
    rollbackForClassName类名数组,必须继承自Throwable导致事务回滚的异常类名字数组
    noRollbackForClass对象数组,必须继承自Throwable不会导致事务回滚的异常类数组
    noRollbackForClassName类名数组,必须继承自Throwable不会导致事务回滚的异常类名字数组

    三、@Transactional 注解的属性信息用法

    @Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。

    虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。但是这个被注解的方法将不会展示已配置的事务设置。

    默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。

    @Transactional(readOnly = true)
    public class DefaultFooService implements FooService {
    
      public Foo getFoo(String fooName) {
        // do something
      }
    
      // these settings have precedence for this method
      //方法上注解属性会覆盖类注解上的相同属性
      @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
      public void updateFoo(Foo foo) {
        // do something
      }
    }
    
    展开全文
  • 主要介绍了spring的@Transactional注解用法解读,具有一定借鉴价值,需要的朋友可以参考下
  • @Transactional可以说是spring中最常用的注解之一了,通常情况下我们在需要对一个service方法添加事务时,加上这个注解,如果发生unchecked exception,就会发生rollback,最典型的例子如下。 @Service public class...

    @Transactional可以说是spring中最常用的注解之一了,通常情况下我们在需要对一个service方法添加事务时,加上这个注解,如果发生unchecked exception,就会发生rollback,最典型的例子如下。

    @Service
    public class StudentService {
        @Autowired
        StudentDao studentDao;
    
        @Transactional
        public void innerSave(int i) {
            Student student = new Student();
            student.setName("test" + i);
            studentDao.save(student);
            //i=5 会出现异常
            int a = 1 / (i - 5);
        }
    }

    在调用innerSave(5)时会发运算异常,导致保存操作回滚,不在此赘述了。
    新的需求:循环保存10个学生,发生异常时要求回滚。
    我们理所当然的写出了下面的代码,在StudentService.java添加如下方法

    public void outerLooper1() {
           for (int i = 1; i <= 10; i++) {
               try{
                   innerSave(i);
               }catch (Exception e){
                   e.printStackTrace();
               }
           }
       }

    先考虑一下test5这个学生有没有保存呢?
    结果:
    在这里插入图片描述
    依然出现了,考虑下问题出在哪儿了?
    其实也好理解,spring中@Transactional 的事务开启 ,是基于接口 或者是类的代理被创建的。所以在同一个类中一个普通方法outerLooper1()调用另一个有事务的方法innerSave(),事务是不会起作用的。要解决这个问题,一般我的做法是写一个帮助类,注入到当前类中,来完成事务操作。

        @Autowired
        UtilService utilService;
    
        public void outerLooper2() {
            for (int i = 1; i <= 10; i++) {
                utilService.innerSave(i);
            }
        }

    在这里插入图片描述
    在spring中使用事务需要遵守一些规范和了解一些坑点,别想当然。列举一下一些注意点。

    • 在需要事务管理的地方加@Transactional 注解。@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的public 方法上。@Transactional 注解只能应用到 public 可见度的方法上。如果你在 protected、private 或者package-visible 的方法上使用@Transactional 注解,它也不会报错,但是这个被注解的方法将不会展示已配置的事务设置。
    • Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。在接口上使用@Transactional 注解,只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。
    • @Transactional 的事务开启 ,或者是基于接口的或者是基于类的代理被创建。所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的。
    • 了解事务的隔离级别,各个数据库默认的隔离级别是不一样的,在spring中用的是isolation =
      Isolation.READ_COMMITTED来设置;了解事务的传播机制,当发生事务嵌套时,按照业务选择对应的传播机制,用propagation
      = Propagation.REQUIRED来设置。
    展开全文
  • 主要介绍了Spring @Transactional注解失效解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • @Transactional注解使用

    2019-10-21 16:25:23
    @Transactional注解 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。 虽然@...
  • 解释@Transactional注解的用法

    万次阅读 多人点赞 2019-07-17 10:41:55
    @Transactional可以说是spring中最常用的注解之一了,通常情况下我们在需要对一个service方法添加事务时,加上这个注解,如果发生unchecked exception,就会发生rollback,最典型的例子如下。 @Service public class...
  • @Transactional注解可以作用于接口、接口方法、类以及类方法上 当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性 当作用在方法级别时会覆盖类级别的定义 当作用在接口和接口方法时则只有在...
  • 1,场景一,最常见的用法,在方法上使用@Transactional 注解,事务正常起作用。无异常时正常插入数据库,有异常时数据不插入数据库,代码如下。 @Service public class ComeServiceImpl implements ComeService { ...
  • @Transactional注解不起作用解决办法及原理分析

    万次阅读 多人点赞 2018-12-09 00:21:50
    Transactional注解标注方法修饰符为非public时,@Transactional注解将会不起作用。例如以下代码。 定义一个错误的@Transactional标注实现,修饰一个默认访问符的方法 /** * @author zhoujy * @date 2018年12月06日...
  • @Transactional注解不起作用

    千次阅读 2019-01-14 21:58:21
    最近,在做springMVC框架练习时,体验了几种事务管理的方式,其中在用@Transactional注解实现事务管理时,遇到了一些问题,最终得到了解决,现跟大家分享下。 先介绍下我做练习用的例子:在数据库中建了个学生信息...
  • 关于@transactional注解的用处与意义

    千次阅读 2017-07-18 11:07:22
    声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到...
  • @Transactional注解详细使用

    万次阅读 2020-06-17 11:33:03
    三、开发案例 workflow服务: payment服务添加注解:回滚所有的异常。 workflow调用payment服务的saveTransactionDatasBatch方法:
  • 文章目录 1.美图 2. 源码 3.@Transactional 注解的属性信息 4.... 案例 6.1 基于tx标签的声明式事物 参考:基于tx标签的声明式事物 6.2 基于@Transactional注解的声明式事物 参考:基于@Transactional注解的声明式事物
  • 1、@Transactional只有加在public 声明的方法时才起作用。 2、@Tansactional声明的方法调用A,调用无@Tansactional声明的方法B时,在A方法执行时,B也会有事务回滚的特性。 3、无@Tansactional声明的方法A,调用@...
  • Transactional注解不起作用分析 一,特性: 1,一般在service里加@Transactional注解,不建议在接口上添加,加了此注解后此类会纳入spring事务管理中,每个业务方法执行时,都会开启一个事务,不过都是按照相同的...
  • 新手疑问之为什么我已经加上了@Transactional注解,还是失效呢??? 这个很好回答,要么没有生成代理类调用,要么没有开启事务。可以参考细说@Transactional用法及原理 老鸟致命疑问之为什么我已经加上了@...
  • @Transactional注解

    2021-03-24 09:28:42
    @Transactional 是声明式事务编程中使用的注解。 事务注解会让一个方法在执行之后,哟啊么提交所有的改变,要么什么都不改变,ACID原则 (原子性,一致性,隔离性,持续性) 添加在接口的实现类上,或者接口的实现...
  • 在我请教了一些前辈之后,我才知道**Spring的@Transactional注解只对unchecked类型的异常有效,比如RuntimeException及其子类,对checked异常是不自动回滚的。**简单来说,就是在代码块try…catch中定义的异常Spring...
  • @Transactional注解的失效场景

    千次阅读 2020-04-16 10:17:01
    二、@Transactional介绍 1、@Transactional注解可以作用于哪些地方? @Transactional 可以作用在接口、类、类方法 作用于类:当把@Transactional 注解放在类上时,表示所有该类的public方法都配置相同的事务属性...
  • @Transactional注解的使用: 1、在方法或者类上都可以添加。(如果在类上添加,则此类中的所有方法都会执行事务,不推荐,因为可能后续接手开发的小伙伴添加方法的时候根本不需要执行事务); 2、触发事务回滚有两...
  • 通过本篇学习,你将加深对@Transactional 注解以及所有的属性的理解,还可以学习到@Transactional 注解常见的失效场景【文章最后】。
  • @Transactional 注解 它能保证方法内多个数据库操作要么同时成功、要么同时失败。 事务方面:主要分为2种 1.编程式事务 2.声明式事务 1.手动指定: try { //TODO something transactionManager.commit...
  • @Transactional 注解详解

    2020-11-11 14:53:36
    说到数据库,我们就会想到事务,在spring或springboot等框架中,关系到数据库的增删改时,也都会使用@Transactional 注解来表示事务的开启,下面说说@Transactional 注解的详情介绍: 1.首先就是引入@Transactional ...
  • 近期项目中遇到很多需要事务处理的逻辑,所以对@Transactional注解作用条件测试了一番。 @Transactional注解是spring定义的一个注解,可以被子类继承,可以声明在类型、方法上,声明在类型时,可以看作给该类型下...
  • @Transactional注解的全部属性详解 属性 类型 描述 value String 可选的限定描述符,指定使用的事务管理器 propagation enum: Propagation 可选的事务传播行为设置 isolation enum: ...
  • @Transactional注解详解

    万次阅读 2019-09-11 15:45:18
    @Transactional注解可以作用于接口、接口方法、类以及类方法上@Transactional注解的可用参数readOnly该属性用于设置当前事务是否为只读事务,设...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 51,227
精华内容 20,490
关键字:

transactional注解的作用