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 等)