事务特性: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