事务

54 阅读2分钟

一、事务的基本概念

事务是一个完整的操作单元,是不可分割的,事务中的操作要么全部成功,要么全部失败

核心特性(ACID)

  1. 原子性(Atomicity) :事务是不可分割的最小单元,要么全部成功,要么全部失败
  2. 一致性(Consistency) :事务开始前到事务结束后,数据总量保持不变
  3. 隔离性(Isolation) :多个事务并发执行时,事务之间相互隔离,互不影响
  4. 持久性(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:记录事务发生前的数据状态,用于回滚
  • 异常回滚增大范围和事务传播用法

image.png

2. 持久性实现

  • Redo Log:记录事务执行后的数据状态,用于故障恢复

五、常见问题与解决方案

1. 事务失效场景

  • 方法非public修饰
  • 自调用问题(同类中方法调用)
  • 异常类型不匹配(默认只回滚RuntimeException)
  • 数据库引擎不支持(如MyISAM)

2. 大事务问题优化

  • 拆分长事务为多个短事务
  • 避免在事务中进行远程调用
  • 非核心操作放到事务外执行

事务是保证数据一致性的关键技术,正确理解和使用事务对于开发可靠的数据驱动应用至关重要。