声明式事务
概念
通过@Transactional注解实现,由Spring AOP自动管理事务。
使用方式
@Service
@Transactional(propagation = Propagation.REQUIRED,
isolation = Isolation.DEFAULT,
rollbackFor = Exception.class)
public class TestServiceImpl implements TestService {
// 所有方法继承事务配置
}
优点
- 非侵入式设计,业务代码与事务管理解耦
- 配置简单,易于维护
- 减少重复代码
缺点
- 调试相对困难(事务边界不明显)
- 对异常处理有严格要求(默认只回滚RuntimeException)
编程式事务
概念
开发者手动编写代码管理事务,通过TransactionTemplate或PlatformTransactionManager实现。
实现方式
@Service
@RequiredArgsConstructor
public class TestServiceImpl implements TestService {
private final TransactionTemplate transactionTemplate;
public String test01() {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
// 业务逻辑
unitInfoMapper.insertUnitInfo(unitInfo);
} catch (Exception e) {
status.setRollbackOnly(); // 手动标记回滚
}
}
});
return "ok";
}
}
优点
- 控制粒度更细,灵活性高
- 可以精确控制事务边界
- 调试更直观
缺点
- 代码侵入性强
- 需要编写大量模板代码
两者对比
| 特性 | 声明式事务 | 编程式事务 |
|---|---|---|
| 实现方式 | 基于AOP | TransactionTemplate API |
| 控制粒度 | 较粗 | 精细 |
| 代码侵入性 | 低 | 高 |
适用场景建议:
- 声明式事务:适合大多数常规业务场景
- 编程式事务:适合需要精细控制事务边界、复杂异常处理的场景