每日一练进击大厂【DAY11】Spring3

90 阅读2分钟

一、Spring中声明式事务注解中的参数

  • propagation传播机制
  • isolation隔离级别
  • timeout超时时间,如果共用一个事务,只有之前的事务设置的tomeout有效
  • rollbackFor回滚异常
  • noRollbackFor不会回滚异常
  @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED,
            timeout = 10000,rollbackFor = Exception.class,noRollbackFor = RuntimeException.class)
    public void transactionalDemo(){
        System.out.println("transactionalDemo");
    }

二、事务的传播机制

  • REQUIRED:是默认的传播机制,如果B方法中调用A,如果B中有事务,则A无论是否开启事务都会使用B的事务,任何地方出现异常A和B都会回滚。
  • REQUIRES_NEW:每次都会开启一个新的事务,外面事务回滚,里面事务不会回滚。
  • NESTED:开启新事务,提交事务依赖于外层事务,如果外层事务回滚,则里面的事务也回滚。
  • SUPPORTS:如果存在一个事务,支持当前事务,如果没有事务,则非事务的执行,完全依赖最外层事务。
  • MANDATORY:必须运行在事务里面。
  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
public enum Propagation {
    REQUIRED(0),
    SUPPORTS(1),
    MANDATORY(2),
    REQUIRES_NEW(3),
    NOT_SUPPORTED(4),
    NEVER(5),
    NESTED(6);

    private final int value;

    private Propagation(int value) {
        this.value = value;
    }

    public int value() {
        return this.value;
    }
}

三、事务的隔离级别

  • DEFAULT:数据库默认的隔离级别。
  • READ_UNCOMMITTED:读未提交,会出现脏读问题。
  • READ_COMMITTED:读已提交,避免脏读,出现不可重复读问题。
  • REPEATABLE_READ:可重复读,避免了脏读和不可重复读。
  • SERIALIZABLE:串行化。
public enum Isolation {
    DEFAULT(-1),
    READ_UNCOMMITTED(1),
    READ_COMMITTED(2),
    REPEATABLE_READ(4),
    SERIALIZABLE(8);

    private final int value;

    private Isolation(int value) {
        this.value = value;
    }

    public int value() {
        return this.value;
    }
}

四、事务的特点

  • 原子性:一个事务是一个不可分割的工作,事务中包括的操作要么都成功,要么都失败。
  • 一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。
  • 隔离性:一个事务的执行不能被其他事务干扰,一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性:事务一旦提交,它对数据库中数据的改变就是永久性的。

五、事务的失效场景

  • 非public方法,事务的实现原理是代理增强,非public不能进行代理增强,不能进行JDK代理或者CGLib代理,cglib代理是非private的就可以代理。
  • 调用本类的方法。
  • 抛出的异常非RuntimeException,如果想要捕获所有异常rollbackFor={Exception.class}。
  • 如果数据库不支持事务,那么也是失效的。

总结

有没有人曾告诉你,你认真的样子真帅