Spring事务传播行为和隔离级别
Spring事务管理是Spring框架的核心功能之一,理解事务传播行为和隔离级别对于保证数据一致性至关重要。
核心问题
事务传播行为(Propagation)
- REQUIRED(默认):如果存在事务则加入,否则创建新事务
- SUPPORTS:如果存在事务则加入,否则以非事务方式执行
- MANDATORY:必须存在事务,否则抛出异常
- REQUIRES_NEW:总是创建新事务,挂起当前事务
- NOT_SUPPORTED:以非事务方式执行,挂起当前事务
- NEVER:以非事务方式执行,如果存在事务则抛出异常
- NESTED:如果存在事务则嵌套,否则创建新事务
事务隔离级别(Isolation)
- READ_UNCOMMITTED:读未提交,最低隔离级别
- READ_COMMITTED:读已提交,避免脏读
- REPEATABLE_READ:可重复读,避免脏读和不可重复读
- SERIALIZABLE:串行化,最高隔离级别,避免所有问题
MySQL默认隔离级别
- MySQL默认使用REPEATABLE_READ
- 通过MVCC(多版本并发控制)实现
事务失效场景
- 方法不是public
- 异常被捕获
- 异常类型不匹配
- 同一个类内部调用
- 数据库不支持事务
常见面试题
REQUIRED和REQUIRES_NEW的区别?
- REQUIRED:加入现有事务
- REQUIRES_NEW:创建新事务,独立提交
如何解决事务失效问题?
- 使用AspectJ代理
- 使用编程式事务
- 避免内部调用
分布式事务如何处理?
- 使用Seata
- 使用TCC模式
- 使用最终一致性方案