摘自:Spring 中的编程式事务TransactionTemplate
Spring有两种事务管理方式:编程式、声明式。
Spring提供两种方式的编程式事务管理,分别是:使用TransactionTemplate和直接使用PlatformTransactionManager。
声明式事务:注解@Transactional
编程式事务:TransactionTempale
采用和其他Spring模板,如JdbcTempalte和HibernateTemplate一样的方法。它使用回调方法,把应用程序从处理取得和释放资源中解脱出来。如同其他模板,TransactionTemplate是线程安全的。
使用场景:调用支付宝/微信的支付接口,调用前先写数据库日志记录。
调用支付宝/微信的支付接口URL后,再记录返回数据和是否成功,失败。
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@SneakyThrows
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
userService.save(userEntity);
ss();
} catch (Exception e) {
status.setRollbackOnly();
System.out.println("xxxx");
throw e;
}
}
});
System.out.println(transactionTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus status) {
// userService.save(userEntity);
return userService.save(userEntity);
}
}));
使用TransactionTemplate 不需要显式地开始事务,甚至不需要显式地提交事务。这些步骤都由模板完成。但出现异常时,应通过TransactionStatus 的setRollbackOnly 显式回滚事务。
TransactionTemplate 的execute 方法接收一个TransactionCallback 实例。Callback 也是Spring 的经典设计,用于简化用户操作, TransactionCallback 包含如下方法。
• Object dolnTransaction(TransactionStatus status) 。
该方法的方法体就是事务的执行体。
如果事务的执行体没有返回值,则可以使用TransactionCallbackWithoutResultl类的实例。这是个抽象类,不能直接实例化,只能用于创建匿名内部类。它也是TransactionCallback 接口的子接口,该抽象类包含一个抽象方法:
• void dolnTransactionWithoutResult(TransactionStatus status)该方法与dolnTransaction 的效果非常相似,区别在于该方法没有返回值,即事务执行体无须返回值。