下面几节解释了命令式和反应式事务管理器的程序性用法:
使用 PlatformTransactionManager
对于强制性事务,你可以直接使用 org.springframework.transaction.PlatformTransactionManager
来管理你的事务。要做到这一点,通过一个 Bean 引用将你使用的 PlatformTransactionManager 的实现传递给你的 Bean。然后,通过使用 TransactionDefinition 和 TransactionStatus 对象,你可以启动事务、回滚和提交。下面的例子展示了如何做到这一点:
// 事物定义
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// 明确设置事物名称是只能通过编程来完成的事情。
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); // 事物传播
// 从事物管理器中获取一个状态
TransactionStatus status = txManager.getTransaction(def);
try {
// 把你的业务逻辑放在这里
} catch (MyException ex) {
txManager.rollback(status); // 异常回滚
throw ex;
}
txManager.commit(status); // 提交事务
使用 ReactiveTransactionManager
当使用反应式事务时,你可以直接使用 org.springframework.transaction.ReactiveTransactionManager 来管理你的事务。要做到这一点,通过一个 Bean 引用将你使用的 ReactiveTransactionManager 的实现传递给你的 Bean。然后,通过使用 TransactionDefinition 和 ReactiveTransaction 对象,你可以启动事务,回滚,和提交。下面的例子展示了如何做到这一点:
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// explicitly setting the transaction name is something that can be done only programmatically
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
Mono<ReactiveTransaction> reactiveTx = txManager.getReactiveTransaction(def);
reactiveTx.flatMap(status -> {
Mono<Object> tx = ...; // put your business logic here
return tx.then(txManager.commit(status))
.onErrorResume(ex -> txManager.rollback(status).then(Mono.error(ex)));
});