事务特性:ACID

原子性:一个事务要么全部执行成功,要么全部执行失败
一致性:执行事务前后,数据保持一致。通过 AID 保证 C
隔离性:每个事务之间是独立的
持久性:一个事务被提交后,它对数据库的改变是持久的

并发事务的问题:

脏读、不可重复读、幻读

隔离级别:

  • 读未提交 READ_UNCOMMITTED
  • 读已提交 READ_COMMITTED
  • 可重复读 REPEATABLE_READ(MySQL 默认
  • 串行化 SERIALIZABLE

传播机制:Propagation,7 个

  • TransactionDefinition.PROPAGATION_REQUIRED:(Spring 默认)
    • required:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:
    • requires_new创建一个新的事务,如果当前存在事务,则把当前事务挂起
  • TransactionDefinition.PROPAGATION_SUPPORTS:
    • supports:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:
    • not_supports:以非事务方式运行,如果当前存在事务,则把当前事务挂起
  • TransactionDefinition.PROPAGATION_NEVER:
    • never:以非事务方式运行,如果当前存在事务,则抛出异常
  • TransactionDefinition.PROPAGATION_MANDATORY:
    • mandatory:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常
  • TransactionDefinition.PROPAGATION_NESTED:
    • nested:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则创建一个新的事务。

@EnableTransactionManagement:开启全局事务注解
@Transactional:加在类、方法上

  • 类上:所有的 public 方法都是开启事务的,并且会覆盖方法上的注解

@Transactional(propagation = Propagation.REQUIRED)

  • propagation:传播机制
    • Propagation:REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED)
  • rollbackFor = {xxxException.class}
    • 指定异常回滚
  • noRollbackFor = {xxxException.class}
    • 指定异常不回滚
  • isolation:隔离级别
  • timeout:超时控制。DEFAULT 数据库默认

Spring 使用 AOP 来实现声明式事务:JDK 动态代理和 CGLIB 动态代理

  • JDK 动态代理:使用接口,实现匿名类,匿名类中包含目标类
  • CGLIB:字节码生成技术,生成目标类的子类

Spring 对接口使用 JDK 动态代理,对类使用 CGLIB

Commit/Rollback:提交、回滚(异常发生时,或者业务不满足一致性)

TODO IDEA 连上虚拟机 MySQL,测试事务回滚

事务行为:

事务开启、事务提交、事务回滚

默认情况下,autocommit 为 true,单条 SQL 执行成功后,MySQL 会自动提交事务
开启事务:START TRANSACTION (SQL 标准) 或 BEGIN
提交和回滚事务: COMMIT ROLLBACK