全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-20 8 分钟 ✍️ juanwangdev

事务管理集成

Spring 事务管理器与 MyBatis 集成后,可通过声明式方式统一管理数据库操作的事务边界。

DataSourceTransactionManager 配置

Spring 提供的平台事务管理器,用于管理基于 JDBC 的事务。

Java Config

Java
@Configuration
@EnableTransactionManagement
public class TransactionConfig {

    @Bean
    public DataSourceTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

XML 配置

XML
<bean id="transactionManager" 
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<!-- 启用注解驱动事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

事务传播行为

传播行为说明场景
REQUIRED默认,有事务则加入,无则新建大多数业务场景
REQUIRES_NEW总是新建事务,挂起当前事务日志记录、审计
NESTED嵌套事务,可部分回滚复杂业务流程
SUPPORTS有事务则加入,无则非事务执行查询方法
NOT_SUPPORTED非事务执行,挂起当前事务批量操作
MANDATORY必须在事务中,否则抛异常强制事务场景
NEVER必须非事务执行,有事务则抛异常特殊要求
Java
// 默认传播行为
@Transactional
public void createUser(User user) {
    userMapper.insert(user);
}

// 独立事务
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void logOperation(String message) {
    logMapper.insert(message);
}

回滚规则

默认只回滚 RuntimeException 和 Error,通过 rollbackFor 可自定义。

Java
// 回滚所有异常
@Transactional(rollbackFor = Exception.class)
public void processOrder(Order order) {
    orderMapper.insert(order);
    // 可能抛出 BusinessException
    validateOrder(order);
}

// 指定回滚多个异常
@Transactional(rollbackFor = {SQLException.class, IOException.class})
public void batchUpdate(List<Data> list) { }

// 排除特定异常不回滚
@Transactional(noRollbackFor = BusinessException.class)
public void syncData() { }

事务隔离级别

隔离级别脏读不可重复读幻读
READ_UNCOMMITTED可能可能可能
READ_COMMITTED可能可能
REPEATABLE_READ可能
SERIALIZABLE
Java
@Transactional(isolation = Isolation.READ_COMMITTED)
public List<User> findUsers() {
    return userMapper.selectAll();
}

// 使用数据库默认
@Transactional(isolation = Isolation.DEFAULT)
public void updateUser(User user) { }

超时与只读事务

Java
// 超时设置(秒)
@Transactional(timeout = 30)
public void batchProcess(List<Data> list) { }

// 只读事务(优化查询性能)
@Transactional(readOnly = true)
public User findById(Long id) {
    return userMapper.selectById(id);
}

readOnly = true 不仅用于优化,某些数据库驱动会据此获取只读连接,提升并发性能。

事务管理器与 MyBatis 集成原理

Java
@Transactional
    |
    v
TransactionInterceptor (AOP 拦截器)
    |
    v
DataSourceTransactionManager
    |
    v
TransactionSynchronizationManager (绑定 Connection 到当前线程)
    |
    v
MyBatis SqlSession (从 DataSource 获取已绑定事务的 Connection)
    |
    v
Mapper 方法执行

MyBatis 的 SqlSession 通过 SpringManagedTransaction 获取事务管理器绑定的 Connection,确保在同一事务内使用同一连接。

多事务管理器

Java
@Configuration
@EnableTransactionManagement
public class MultiTxConfig {

    @Bean("primaryTx")
    @Primary
    public PlatformTransactionManager primaryTxManager(
            @Qualifier("primaryDataSource") DataSource ds) {
        return new DataSourceTransactionManager(ds);
    }

    @Bean("secondaryTx")
    public PlatformTransactionManager secondaryTxManager(
            @Qualifier("secondaryDataSource") DataSource ds) {
        return new DataSourceTransactionManager(ds);
    }
}

// 指定事务管理器
@Transactional("secondaryTx")
public void saveToSecondary(Data data) { }

事务失效场景

text
@Service
public class OrderService {

    // 自调用不走代理,事务失效
    public void createOrder() {
        this.saveOrder();  // 事务不生效
    }

    @Transactional
    public void saveOrder() { }

    // 非 public 方法,事务失效
    @Transactional
    protected void internalMethod() { }
}

要点总结

  • 通过 @EnableTransactionManagement 启用注解驱动事务
  • DataSourceTransactionManager 管理 JDBC 事务,与 MyBatis 无缝集成
  • 默认只回滚 RuntimeException 和 Error,需 rollbackFor 指定全异常回滚
  • 传播行为控制事务边界,REQUIRES_NEW 用于独立事务
  • 只读事务 readOnly = true 可优化查询性能
  • 自调用和非 public 方法导致事务失效
  • 多事务管理器需通过 value 属性指定

📝 发现内容有误?点击此处直接编辑

← 上一篇 Spring-MyBatis 集成
下一篇 → 多数据源配置
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库