spring事务失效八大场景-第十章

系列文章目录

第一章 ArrayList-Java八股面试(一)

第二章 HashMap-Java八股面试(二)

第三章 单例模式-Java八股面试(三)

第四章 线程池和Volatile关键字-Java八股面试(四)

第五章 ConcurrentHashMap-Java八股面试(五)

第六章 spring之refresh流程-Java八股面试(六)

第七章 Spring Bean生命周期七大阶段-Java八股面试(七)

第八章 JVM内存模型和垃圾回收机制-第八章

第九章 类加载机制和finalize方法-第九章


文章目录

  • 系列文章目录
  • 1. 抛出检查异常
  • 2. 业务捕捉异常try catch
  • 3. aop切面导致事务不能正常回滚
  • 4. 非public方法
  • 5. 父子容器导致的事务失效
  • 6. 调用本类方法
  • 7. select语句不会加锁
  • 8. 没有被Spring管理


1. 抛出检查异常

spring事务失效八大场景-第十章_第1张图片

如果@Transactional 没有特别指定,Spring 只会在遇到运行时异常RuntimeException或者error时进行回滚,而IOException等检查异常不会影响回滚。

spring事务失效八大场景-第十章_第2张图片

正确做法:
spring事务失效八大场景-第十章_第3张图片

2. 业务捕捉异常try catch

这种场景下,事务失败的原因也很简单,Spring是否进行回滚是根据你是否抛出异常决定的,所以如果你自己捕获了异常,Spring 也无能为力。
在这里插入图片描述

3. aop切面导致事务不能正常回滚

spring事务失效八大场景-第十章_第4张图片

order是用来定义优先级的,在上面的示例中,事务将失败。原因是Spring的事务切面优先级最低,所以如果异常被切面捕获,Spring自然不能正常处理事务,因为事务管理器无法捕获异常。

在这里插入图片描述

4. 非public方法

spring事务失效八大场景-第十章_第5张图片

5. 父子容器导致的事务失效

spring事务失效八大场景-第十章_第6张图片

事务的传播机制说明如下:

  • REQUIRED 如果当前上下文中存在事务,那么加入该事务,如果不存在事务,创建一个事务,这是默认的传播属性值。
  • SUPPORTS 如果当前上下文存在事务,则支持事务加入事务,如果不存在事务,则使用非事务的方式执行。
  • MANDATORY 如果当前上下文中存在事务,否则抛出异常。
  • REQUIRES_NEW 每次都会新建一个事务,并且同时将上下文中的事务挂起,执行当前新建事务完成以后,上下文事务恢复再执行。
  • NOT_SUPPORTED 如果当前上下文中存在事务,则挂起当前事务,然后新的方法在没有事务的环境中执行。
  • NEVER 如果当前上下文中存在事务,则抛出异常,否则在无事务环境上执行代码。
  • NESTED 如果当前上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务。

spring事务失效八大场景-第十章_第7张图片

6. 调用本类方法

@Service
public class DefaultTransactionService implement Service {

    public void saveUser() throws Exception {
        //do something
        doInsert();
    }

    @Transactional(rollbackFor = Exception.class)
    public void doInsert() throws IOException {
        User user = new User();
        UserService.insert(user);
        throw new IOException();

    }
}

spring事务失效八大场景-第十章_第8张图片

7. select语句不会加锁

在这里插入图片描述

8. 没有被Spring管理

// @Service
public class OrderServiceImpl implements OrderService {
    @Transactional
    public void updateOrder(Order order) {
        // update order
    }
}

你可能感兴趣的:(spring,java,面试)