一、事务的基本概念
事务是一个完整的操作单元,是不可分割的,事务中的操作要么全部成功,要么全部失败
核心特性(ACID)
- 原子性(Atomicity) :事务是不可分割的最小单元,要么全部成功,要么全部失败
- 一致性(Consistency) :事务开始前到事务结束后,数据总量保持不变
- 隔离性(Isolation) :多个事务并发执行时,事务之间相互隔离,互不影响
- 持久性(Durability) :事务一旦提交,数据永久的持久化
二、Spring事务管理*
1. 声明式事务配置
java
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
2. 事务传播行为
| 传播行为类型 | 说明 |
|---|---|
| REQUIRED (默认) | 如果当前存在事务,则加入该事务;否则新建一个事务 |
| REQUIRES_NEW | 新建事务,如果当前存在事务,则挂起当前事务,创建新事务 |
| NESTED | 如果当前存在事务,则在嵌套事务内执行 |
| SUPPORTS | 如果当前存在事务,则加入该事务;否则以非事务方式运行 |
| NOT_SUPPORTED | 以非事务方式执行,如果当前存在事务,则挂起当前事务 |
| MANDATORY | 必须在一个已有的事务中执行,否则抛出异常 |
| NEVER | 必须在没有事务的情况下执行,否则抛出异常 |
3. 事务注解使用(可以用在方法,类上,但重点用在方法上)
java
@Service
public class OrderService {
@Transactional(
propagation = Propagation.REQUIRED,
isolation = Isolation.READ_COMMITTED,
timeout = 30,
rollbackFor = Exception.class
)
public void placeOrder(Order order) {
// 业务逻辑
}
}
三、事务实现机制
1. 原子性实现
- Undo Log:记录事务发生前的数据状态,用于回滚
- 异常回滚增大范围和事务传播用法
2. 持久性实现
- Redo Log:记录事务执行后的数据状态,用于故障恢复
五、常见问题与解决方案
1. 事务失效场景
- 方法非public修饰
- 自调用问题(同类中方法调用)
- 异常类型不匹配(默认只回滚RuntimeException)
- 数据库引擎不支持(如MyISAM)
2. 大事务问题优化
- 拆分长事务为多个短事务
- 避免在事务中进行远程调用
- 非核心操作放到事务外执行
事务是保证数据一致性的关键技术,正确理解和使用事务对于开发可靠的数据驱动应用至关重要。