spring-TransactionTemplate 编程式事务
TransactionTemplate
是 Spring 框架提供的用于管理事务的一种方式。它提供了一种编程式的事务管理方法,允许开发者在代码中显式地控制事务的开始、提交或回滚。与使用 @Transactional
注解相比,TransactionTemplate
提供了更多的灵活性和控制力。
为什么不用 @Transactional
虽然 @Transactional
注解提供了一种简单的方式来声明事务边界,但在某些情况下,它的局限性可能会限制你的应用设计:
- 跨越服务边界:如果你的服务逻辑跨越了多个服务,那么使用
@Transactional
可能会变得复杂,因为每个服务可能有自己的事务边界。 - 更细粒度的控制:
TransactionTemplate
允许你在运行时动态地更改事务属性,比如隔离级别或传播行为。 - 异常处理:有时你可能希望根据特定的异常类型来决定是否回滚事务,而不仅仅是所有类型的异常。
- 性能考量:在一些性能敏感的应用中,你可能希望避免代理带来的开销(当使用基于 AOP 的
@Transactional
时),而是选择更轻量级的方法,如TransactionTemplate
。
总之,TransactionTemplate
和 @Transactional
都有它们各自的适用场景。选择哪一个取决于你的具体需求以及对事务管理的控制程度。
TransactionTemplate 代码示例
执行事务无返回
@Autowired
private TransactionTemplate transactionTemplate;
transactionTemplate.executeWithoutResult(new Consumer<TransactionStatus>() {
@Override
public void accept(TransactionStatus transactionStatus) {
try {
// 如果操作成功,不抛出异常,事务将提交
memberService.save(member);
System.out.println("1/0 = " + 1 / 0);
orderItemService.save(orderItem);
} catch (Exception e) {
// 如果操作失败,抛出异常,事务将回滚
transactionStatus.setRollbackOnly();
}
}
});
执行事务有返回
@Autowired
private TransactionTemplate transactionTemplate;
String rr = transactionTemplate.execute(new TransactionCallback<String>() {
@Override
public String doInTransaction(TransactionStatus status) {
try {
memberService.save(member);
System.out.println("1/0 = " + 1 / 0);
orderItemService.save(orderItem);
return "ok";
} catch (Exception e) {
//回滚
status.setRollbackOnly();
return null;
}
}
});