image.png

    1. 事务的ACID特性:

    原子性 atomicity, 一致性 consistency,隔离性 isolation,durability 持久性
    undo日志保证A和C
    加锁 MVCC等 保证 I
    redo日志保证D

    1. 事务的属性
      1. 传播行为

    枚举类Propagation
    image.png
    注意:requires new这种 如果外部方法A已经有事务,又在内部方法B中新建一个事务的话,A回滚不会影响B,但是B回滚会让A也跟着回滚因为这个异常被 aMethod()的事务管理机制检测到了。

    1. 隔离级别

    枚举类Isolation
    MySQL 默认采用的 REPEATABLE_READ 隔离级别 Oracle 默认采用的 READ_COMMITTED 隔离级别.
    ISOLATION_READ_UNCOMMITTED
    ISOLATION_READ_COMMITTED
    ISOLATION_REPEATABLE_READ
    ISOLATION_SERIALIZABLE
    区分不可重复读和幻读

    隔离级别 脏读 不可重复读 幻读
    READ-UNCOMMITTED
    READ-COMMITTED ×
    REPEATABLE-READ × ×
    SERIALIZABLE × × ×
    1. 回滚规则

    默认情况:遇到运行时异常,ERROR会回滚,检查型异常(CHECKED)不会

    1. 是否只读

    为什么数据库查询操作需要开启事务?
    答:如果读取一条,那无所谓,因为mysql默认保证一条sql查询的读一致性
    但是如果读取多条,必须保证整体的读一致性,要开事务

    1. 事务超时

    事务所允许执行的最长时间,超时未完成自动回滚。int值表示,单位是s,默认-1(永不超时)

    1. @Transaction事务注解原理

    @Transactional 的工作机制是基于 AOP 实现的,AOP 又是使用动态代理实现的。如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理,如果目标对象没有实现了接口,会使用 CGLIB 动态代理。
    image.png
    Spring AOP 自调用问题:(类中的方法调用类自己的另一个方法)
    同一个类中,没有 @Transactional 注解的方法内部调用有 @Transactional 注解的方法,有@Transactional 注解的方法的事务会失效
    这是由于Spring AOP代理的原因造成的,因为只有当 @Transactional 注解的方法在类以外被调用的时候,Spring 事务管理才生效。
    解决办法就是避免同一类中自调用或者使用 AspectJ 取代 Spring AOP 代理**