跳到主要内容

3.3 事务管理 - Spring Boot

编程式事务

使用 DB.Tx.run(),与 @Transactional 等价:

// 默认数据源事务
DB.Tx.run(() -> {
DB.Pojo.insert(user);
DB.Pojo.insert(userLog);
});

// 指定数据源事务
DB.Tx.run("slave", () -> {
DB.Pojo.insert(user);
});

// 带返回值
Long id = DB.Tx.run(() -> {
DB.Pojo.insert(user);
return user.getId();
});

声明式事务

使用 @Transactional

@Service
public class OrderService {

@Transactional
public void createOrder(Order order, List<OrderItem> items) {
DB.Pojo.insert(order);
items.forEach(item -> {
item.setOrderId(order.getId());
DB.Pojo.insert(item);
});
}
}

事务传播

@Transactional(propagation = Propagation.REQUIRED) // 默认
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Transactional(propagation = Propagation.NESTED)

只读事务

@Transactional(readOnly = true)
public List<User> findAll() {
return DB.Pojo.select(User.class).queryBeanList();
}

异常回滚

@Transactional(rollbackFor = Exception.class)
@Transactional(noRollbackFor = BusinessException.class)

实现说明

Spring Boot 下 DB.Tx 基于 SpringTxExecutor,底层使用 Spring TransactionSynchronizationManager,复用 Spring 事务管理。

注意事项

  • @Transactional 无法感知 DB.Dynamic.use(name, ...) 切换后的数据源
  • 跨数据源事务请使用 DB.Tx.run(name, () -> ...)
  • 不支持跨数据源分布式事务(请使用 Seata 等)