下面几节解释了命令式和反应式事务管理器的程序性用法:
使用 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 programmaticallydef.setName("SomeTxName");def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);Mono<ReactiveTransaction> reactiveTx = txManager.getReactiveTransaction(def);reactiveTx.flatMap(status -> {Mono<Object> tx = ...; // put your business logic herereturn tx.then(txManager.commit(status)).onErrorResume(ex -> txManager.rollback(status).then(Mono.error(ex)));});
